Unity的导航系统是人物方便的移动

本文详细介绍Unity中的导航系统,包括导航网格的烘焙流程,如何通过烘焙调整物体的可导航性,以及如何利用NavMeshAgent组件使角色在场景中智能移动。同时,文章还介绍了通过C#脚本实现射线检测来设定角色目的地的方法,以及如何控制摄像机跟随角色移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导航系统:
1.导航网格的烘焙:Window–>Navigation(导航)–>在确保Hierarchy中的 环境因素(地形及地形上的种种环境)都为Navigation Static ,【 若物体属性的Navigation Static不被勾选,则该物体被认为是 可以进行导航的物体(即人物可以穿过这里)】—>点击Navigation->Bake 中的 Bake 即进行烘焙

烘焙导航网格后,蓝色区域为可导航的区域【 取消部分物体的可导航性—>Ctrl点选多个物体后,在Navigation->Object 中选中的物体的 Navigation Area 设置为 Not Walkable】
【是部分物体可以 导航(通过)—>Ctrl点选多个物体后,将这些物体的 Inspector 的 Static 中的 Navigation Static 取消勾选】
重设物体的导航性后,再次Bake即可。

2.使人物在导航网格上运动:在 人物 的 Inspector 中 Add-> Nav Mesh Agent 组件,通过该组件的Radius 和 Height 属性 确定移动时人物的有效大小。
在Project 中创建 C#脚本,并将脚本拖拽到 人物 的 Inspector 中,打开该C#脚本—>通过射线检测(通过鼠标点击,发出竖直射线与地形进行碰撞产生的点)获取 点的位置–>

    using UnityEngine.AI; //NavMeshAgent 位于这个命名空间,要使用这个命名空间

//获取Nav Mesh Agent 组件,设为public 则 Unity 中人物的C#脚本中会自动更新出Agent属性!
    public NavMeshAgent agent; 

    void Update () {
    if (Input.GetMouseButtonDown(0)) //鼠标左键是否按下,0代表左键
    {
        /*获取到一个射线 ray ,Main Camera 用来把一个屏幕坐标转换成一个 ray,
        屏幕坐标通过 Input.mousePosition 获取*/
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        //使用 RaycastHit 保存碰撞信息 
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit))       /*进行射线检测--判断是否发生碰撞,
        传递参数 射线 和 out参数 hit,如果发生碰撞,则会将碰撞信息保存到 hit 中*/
        {
            //通过hit.point 获取碰撞发生的位置
            //print(hit.point); 

            /*使用 获取的碰撞发生的坐标 在Nav Mesh Agent组件中,设置其中的目的地属性,
            这样可以使Nav Mesh Agent 朝这个坐标运动 !!!*/
            agent.SetDestination(hit.point);
        }
    }
}

在Unity 中人物的C#脚本中自动更新出Agent属性后,将Nav Mesh Agent 组件拖拽为Agent的赋值 ---->运行游戏后,点击导航网格,人物即向agent的目的地移动。
人物转向的速度由NavMeshAgent组件中的Angular Speed 控制,其值越大,转向速度越快。

控制摄像机对人物的跟随: 首先 调整相机至跟随的合理的位置(一般为后上方)—>为Main Camera (相机) 创建 C#脚本组件(步骤同前)—>【使人物与相机的偏移量始终 等于 两者初始的偏移量】

//为获取跟随目标的位置,获取跟随的目标的Transform组件
//设置为public,可在Unity中直接显示!!
public Transform hero;
private Vector3 offset;//定义位置的便偏移

void Start () {

    //先获取初始偏移,当前位置 - hero的位置。
    offset = transform.position - hero.position;
}

void Update () {

    //在后期保持相机和主角的偏移-->当前位置 = 初始偏移量 + hero现在的位置
    transform.position = offset + hero.position;
	
}

在Unity中,Main Camera 的C#脚本组件中显示Hero属性,其赋值为 拖拽到其中的Hierarchy 中的人物。—>开始运行,点击场景,相机跟随人物移动。

### 实现 Unity 中的第一人称角色移动Unity 中实现第一人称角色移动是一项常见的需求,可以通过多种方式完成。以下是基于提供的引用以及专业知识的一种解决方案。 #### 使用输入控制角色移动 通过键盘输入来控制角色的前后左右移动是一种常见的方式。可以利用 `Input.GetAxis` 方法获取玩家按键的方向,并将其应用于角色控制器或刚体组件上[^1]。以下是一个简单的脚本来展示如何实现这一功能: ```csharp using UnityEngine; public class FirstPersonMovement : MonoBehaviour { public CharacterController controller; public float speed = 6.0f; private Vector3 moveDirection; void Update() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); moveDirection = new Vector3(horizontal, 0, vertical); moveDirection = transform.TransformDirection(moveDirection); // 转换到世界坐标系 moveDirection *= speed; if (controller.isGrounded) moveDirection.y -= Physics.gravity.magnitude * Time.deltaTime; // 添加重力效果 controller.Move(moveDirection * Time.deltaTime); // 移动角色 } } ``` 此代码片段展示了如何使用 `CharacterController` 组件处理平滑的角色移动[^4]。注意这里还加入了基本的重力模拟逻辑。 #### 结合动画系统增强视觉反馈 如果希望让角色的动作更加自然流畅,则需要引入动画系统。根据给定的信息,在状态机中设置不同动作之间的过渡条件是非常重要的[^2]。例如当检测到速度发生变化时切换至行走或者跑步动画。 对于更复杂的场景比如导航网格代理(NavMeshAgent),也可以结合其目标更新机制动态调整播放中的动画序列[^3]: ```csharp void OnAnimatorMove(){ animator.SetFloat ("Speed", navMeshAgent.velocity.magnitude ); } ``` 上述伪代码表示每当调用 Animator 的 Move 函数之前都会重新计算当前的速度参数并传递给对应的浮点数变量 Speed ,从而影响最终呈现出来的画面表现形式。 综上所述,以上两种技术都可以单独应用亦或是混合搭配起来共同作用于项目之中以达到最佳用户体验标准的同时保持开发效率最大化的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值