Unity A* Pathfinding Project Pro 插件自学习

插件核心脚本:

1.astarpath.cs 用于寻路 Component->Pathfinding->Pathfinder添加”astarpath.cs”

2.seeker.cs 用于需要寻路的物体

3.SimpleSmoothModifier.cs 调控路径使其更加圆滑、简单

步骤1:创建一个新层(edit->project settings->tags and layers),命名为”Ground”,把plane设为”Ground”,创建一些cube作为障碍物,把这些cube设为新的层”Obstacles”

步骤2:创建一个空物体命名为"A* 脚本”,选择物体,然后单击[Component] - [Pathfinding] - [Pathfinder] 

步骤3 :创建"控制对象"物体,选择[Component] - [Pathfinding] - [Seeker] ,载入插件脚本,用于寻路

                      

Pathfinder脚本作用是在Unity3D地图上生成路径网格,为路径规划策略提供前提。

效果如图所示:

路径网格生成脚本Pathfinder中的参数:

        Width和Depth : 网格长度和宽度设置,为Transform的X10,即Plane(10,0,10),则(Width,Depth)=(100,100)

        Obstacle Layer Mask:如步骤1设置,用于避障

        其它参数自行摸索。

平滑脚本Simple Smooth中的参数:

        Max Segment Length : 路径点之间的距离

        Iterations : 迭代次数,路径的平滑系数  

        Strength : 路径的强硬系数

“Astar AI”脚本作用是对插件规划出的路径Path点做处理,然后进行简单的控制:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Pathfinding;
using System;

public class AstarAI : MonoBehaviour
{
    //目标物体与目标位置
    public GameObject targetObject;
    private Vector3 targetPosition;

    private Seeker seeker;

    //存储路径
    public Path path;
    //角色移动速度
    public float speed = 100.0f;
    public float turnSpeed = 5f;
    //判断玩家与航点的距离
    public float nextWaypointDistance = 3;
    //对当前的航点进行编号
    private int currentWaypoint = 0;
    // Start is called before the first frame update
    public Transform obj_g;
    void Start()
    {
        seeker = GetComponent<Seeker>();

        //注册回调函数,在Astar Path完成后调用此函数
        seeker.pathCallback += OnPathComplete;

    }

    // Update is called once per frame
    void FixedUpdate()
    {
        targetPosition = targetObject.transform.position;
        
        //开始寻路
        if (Input.GetKey(KeyCode.K)) { seeker.StartPath(transform.position, targetPosition); }
        if (path == null)
        {
            return;
        }
        if (Vector3.Distance(transform.position, path.vectorPath[currentWaypoint + 1])<3)
        {
            currentWaypoint++;
        }
        Vector3 dir = (path.vectorPath[currentWaypoint + 1] - transform.position);//.normalized;
        dir *= speed * Time.fixedDeltaTime;
        //玩家转向
        transform.Translate(Vector3.forward * Time.fixedDeltaTime * speed);
        Quaternion targetRotation = Quaternion.LookRotation(dir);

        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * turnSpeed);

        Debug.Log($"目标朝向{targetRotation.eulerAngles.y},目标X{path.vectorPath[currentWaypoint].x}");
        obj_g.transform.position = path.vectorPath[currentWaypoint+1];
    }
    /// <summary>
    /// 当寻路结束后调用这个函数
    /// </summary>
    /// <param name="p"></param>
    private void OnPathComplete(Path p)
    {
        //Debug.Log("发现这个路线" + p.error);
        if (!p.error)
        {
            path = p;
            currentWaypoint = 0;
        }
    }
    private void OnDisable()
    {
        seeker.pathCallback -= OnPathComplete;
    }
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
烘培桥是指将场景中的网格图(NavMesh)生成并保存在磁盘上,以便在运行时进行快速的路径计算。要在Unity中使用A*路径查找算法,需要使用Unity的NavMesh系统,并使用A*寻路插件来执行路径计算。 以下是在Unity中使用A*路径查找算法的步骤: 1. 安装A*寻路插件:从Unity Asset Store中下载并导入A* Pathfinding Project Pro插件。 2. 创建场景:在Unity中创建一个场景,并添加游戏对象和地形。 3. 创建NavMesh:使用Unity的NavMesh系统来创建场景的NavMesh。在场景中选择菜单栏的“Window”->“Navigation”,打开“Navigation”窗口,然后单击“Bake”按钮来烘焙NavMesh。 4. 添加A*路径查找组件:在场景中选择要使用A*路径查找算法的游戏对象,然后右键单击并选择“Add Component”->“A* Pathfinding”->“A* Pathfinding Component”。这将添加一个A*路径查找组件到游戏对象上。 5. 设置路径查找组件:在A*路径查找组件的属性窗口中,设置起点和终点,以及其他路径查找参数,例如搜索半径、移动速度和路径平滑等。 6. 执行路径查找:在游戏运行时,调用A*路径查找组件的路径查找函数来执行路径查找。例如,在脚本中调用“GetComponent<AstarPath>().Scan()”函数来执行路径查找。 7. 显示路径:在游戏运行时,使用A*路径查找组件的路径可视化功能来显示路径。例如,在脚本中调用“GetComponent<AstarPath>().DrawPath()”函数来显示路径。 以上是在Unity中使用A*路径查找算法的基本步骤。通过使用A*寻路插件Unity的NavMesh系统,可以轻松地实现高效的路径查找功能,从而为游戏开发带来更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值