当前位置:   article > 正文

T05_unityAI跳跃球 c#_unity小球弹跳

unity小球弹跳

首先创建一个3D项目,并给项目起一个名字

首先创建一个地面,起名为Ground,并修改其大小

创建一个材质文件包 创建一个颜色材质

起名为Ground,拖动拽入场景 

可以调制材质棋盘格

调至100*100格子

 

 接下来创建一个3D小球

resset下让小球放置场景正中心

 

接下来我们创建几个材质做备用,分别是red,orange,yellow,green,blue

 将小球y轴调至0.5使小球在地面上

 除了小球身上的碰撞器以外

还要在小球身上添加刚体

 

 

 如果没有导航组件可以

 

 

导入即可

接下来给小球添加导航组件(给小球添加导航组件后小球就可以通过导航寻路走路)

 

 接下来我们调整视角 准备做障碍物

首先创建一个3Dcube 

 

 修改他的参数作为墙起名wallLeft

 

ctrl + d 复制 起名WallLeft

 

 创建一个空物体,以此类推创建一个组合放进空物体里

ctrl + d 复制 一份组合空物体

 

小球跳的原理:跳的时候,关闭导航组件,不跳的时候,开启导航组件

 接下来创建一个脚本文件夹

 创建一个c#脚本起名 JumpTest

将脚本绑定小球

 打开进入c#脚本将一下代码复制

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class JumpTest : MonoBehaviour
{
    //实验需求:按空格键,小球向前跳跃
    [SerializeField]
    private float jumpForce = 20f;    //力
    private NavMeshAgent agent = null;    //导航组件
    private Rigidbody rb = null;   //刚体组件引用
    private bool isJumping;
    private void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        rb = GetComponent<Rigidbody>();
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (!isJumping)  //isJumping == false
            {
                isJumping = true;
                agent.enabled = false;   //关闭导航组件
                rb.AddForce(Vector3.up * jumpForce * Time.deltaTime, ForceMode.Impulse);

            }
        }if (transform.position.y > 3f)
        {
            rb.AddForce(Vector3.forward * 500 * Time.deltaTime, ForceMode.Force);
        }
        //说明小球已经落地了
        if (isJumping && rb.velocity.y == 0)
        {
            isJumping = false;
            agent.enabled = true;
        }
    }
}

再创建一个c#脚本起名为 AI

 

将以下代码复制

using UnityEngine;
using UnityEngine.AI;

public class AI : MonoBehaviour
{
    public Transform[] jumpPoints; // 跳跃点数组
    private NavMeshAgent navMeshAgent; // 导航网格代理组件
    private int currentJumpPointIndex; // 当前跳跃点索引
    private bool isJumping; // 跳跃状态

    [SerializeField]
    private float jumpForce = 5f; // 跳跃力

    void Start()
    {
        navMeshAgent = GetComponent<NavMeshAgent>(); // 获取导航网格代理组件
        currentJumpPointIndex = 0; // 初始化当前跳跃点索引为0
        isJumping = false; // 初始化跳跃状态为false
    }

    void Update()
    {
        if (jumpPoints.Length > 0) // 如果有跳跃点
        {
            navMeshAgent.SetDestination(jumpPoints[currentJumpPointIndex].position); // 设置目标点为当前跳跃点

            // 检查小球是否靠近当前跳跃点
            if (Vector3.Distance(transform.position, jumpPoints[currentJumpPointIndex].position) < 1f)
            {
                if (!isJumping) // 如果当前未处于跳跃状态
                {
                    isJumping = true; // 设置跳跃状态为true
                    GetComponent<Rigidbody>().AddForce(Vector3.up * jumpForce, ForceMode.Impulse); // 对小球施加向上的跳跃力
                }
            }
            else
            {
                isJumping = false; // 设置跳跃状态为false
            }

            if (isJumping && GetComponent<Rigidbody>().velocity.y == 0) // 如果处于跳跃状态并且垂直速度为0
            {
                // 切换到下一个跳跃点
                currentJumpPointIndex++;
                if (currentJumpPointIndex >= jumpPoints.Length)
                {
                    // 重置跳跃点索引为0
                    currentJumpPointIndex = 0;
                }
                isJumping = false; // 设置跳跃状态为false
            }
        }
    }
}

 接下来点击

 ctrl选中除地板和小球以外的障碍物体点击设置

 

 选中地板点击设置

 选中小球点击设置

 接下来ctrl 选中 所有物体 点击bake烘培

烘培效果如下

 

选择主摄像机对齐视角

 

检查小球是否绑定了两个脚本+刚体+碰撞器+Nav导航组件

 再创建一个空物体 作为移动停止目标

将该目标移动至障碍物之后终点处

 

将空物体MBy轴调至与小球同高 0.5

 

 我们通过材质给墙体及障碍物涂上颜色

运行即可自动巡航

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/126509?site
推荐阅读
相关标签
  

闽ICP备14008679号