GDPU unity游戏开发 寻路与导航

作者 : admin 本文共1801个字,预计阅读时间需要5分钟 发布时间: 2024-06-10 共2人阅读

学会寻路,出门在外,身份不是他给的,他做不了你一直的导航。

角色寻路

角色控制器替换为普通的角色控制器,给实验九的地形增加NavMesh Surface组件,然后给角色增加NavMesh Agent组件,并选择合适的参数。通过脚本来实现自动寻路。

结合实验十的动画角色,将角色控制器替换为动画角色,并通过脚步来实现自动寻路。采用寻路系统后,角色的移动是由寻路系统来完成的,也就是说寻路系统会直接修改角色的坐标。停用动画的root motion,然后将寻路系统agent的速度传递给动画角色的混合树,由动画控制角色的动作,但角色的实际移动仍然由寻路系统控制。

先找到菜单的AI组件,旧版的看着办,新版的跟着来。新版的要在package下好包找到registry。

GDPU unity游戏开发 寻路与导航插图

下好后,在windows菜单下可以找到navigation面板。

GDPU unity游戏开发 寻路与导航插图(1)

按照题设分别给一个新的胶囊体跟地形分别加NavMesh Agent组件与NavMesh Surface组件。然后给新的胶囊体挂载寻路的脚本。

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

public class navmeshAgent : MonoBehaviour
{
    public Transform targetpostion;
    void Update()
    {
        NavMeshAgent agent = this.GetComponent();
        agent.destination = targetpostion.position;
        
    }
}

GDPU unity游戏开发 寻路与导航插图(2)

GDPU unity游戏开发 寻路与导航插图(3)

放置寻路的物体最好接近一下地面,要设置目标物体的位置。让目标物体更灵活一点,可以通过射线检测,通过点击这个目标物体,让它运动,挂载射线检测的脚本到相机上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEngine.GraphicsBuffer;

public class sctoRay : MonoBehaviour
{
    public Transform target;
    void Update()
    {
        // 检测鼠标左键是否被点击
        if (Input.GetMouseButtonDown(0))
        {
            // 发射一条射线从鼠标点击的位置
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            // 检测射线是否击中物体
            if (Physics.Raycast(ray, out hit))
            {
              if(hit.rigidbody != null) {
                    hit.rigidbody.AddForceAtPosition(ray.direction * 200.0f, hit.point);
                }

                Debug.Log(hit.point);
            }
           
        }
    }
}

然后点击NavMesh Surface组件的bake,可以看到scene面板中的寻路区域。

GDPU unity游戏开发 寻路与导航插图(4)

要是看不到,可能是你没让它显示。

GDPU unity游戏开发 寻路与导航插图(5)

点击运行,可以观察到控制器的寻路。

GDPU unity游戏开发 寻路与导航插图(6)GDPU unity游戏开发 寻路与导航插图(7) 

接着是动画角色的寻路,先把之前的角色搬过来,把没有用到的禁用。

GDPU unity游戏开发 寻路与导航插图(8)

GDPU unity游戏开发 寻路与导航插图(9)

之前的实验中,通过设置了speed让动画角色有不同的状态,采用寻路系统后,角色的移动是由寻路系统来完成的。停用动画的root motion,用脚本将寻路系统agent的速度传递给动画角色的混合树。

using UnityEngine;
using UnityEngine.AI;
public class NavAgentAnimator : MonoBehaviour

{

    public NavMeshAgent agent;

    public Animator animator;

    void Start()
    {

        if (agent == null)

            agent = GetComponent();

        if (animator == null)

            animator = GetComponent();

    }

    void Update()
    {

        // 计算速度的大小

        float speed = agent.velocity.magnitude;

        // 将速度传递给Animator

        animator.SetFloat("Speed", speed);

    }

}

GDPU unity游戏开发 寻路与导航插图(10)GDPU unity游戏开发 寻路与导航插图(11) 

点击运行,可看到角色带有动画的寻路。

GDPU unity游戏开发 寻路与导航插图(12)GDPU unity游戏开发 寻路与导航插图(13)GDPU unity游戏开发 寻路与导航插图(14) 

实验心得

 他说,尽管前方拥堵,但你仍在最优路线上。

本站无任何商业行为
个人在线分享 » GDPU unity游戏开发 寻路与导航
E-->