简单的寻路及使用编辑器扩展工具设置路径点

简单的寻路及路径点编辑

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//非常简单的路径管理类
public class PathMgr : MonoBehaviour
{
    public List<PathPoint> pathPoints = new List<PathPoint>();

    public void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        for (int i=0; i<pathPoints.Count; i++)
        {
            if (pathPoints[i].trans == null) continue;
            Gizmos.DrawSphere(pathPoints[i].trans.position, .1f);
            if (i != 0 && pathPoints[i - 1].trans != null)
            {
                Gizmos.DrawLine(pathPoints[i-1].trans.position, pathPoints[i].trans.position);
            }
        }
    }
}

[System.Serializable]
public class PathPoint
{
    public Transform trans;
    public bool isLinkNextPoint = true;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
//编辑器扩展方便设置路径点
[CustomEditor(typeof(PathMgr))]
public class PathEditor : Editor
{
    PathMgr _script;
    private void OnEnable()
    {
        _script = target as PathMgr;
    }

    public override void OnInspectorGUI()
    {
        EditorGUILayout.BeginVertical("box");
        if (GUILayout.Button("增加路径点"))
        {
            _script.pathPoints.Add(new PathPoint());
        }

        for (int i=0; i<_script.pathPoints.Count; i++)
        {
            EditorGUILayout.BeginHorizontal("box");
            _script.pathPoints[i].trans = (Transform)EditorGUILayout.ObjectField(_script.pathPoints[i].trans, typeof(Transform), true, GUILayout.ExpandWidth(true));
            if (GUILayout.Button("-",EditorStyles.miniButton,GUILayout.Width(30)))
            {
                _script.pathPoints.RemoveAt(i);
                break;
            }
            EditorGUILayout.EndHorizontal();
        }

        EditorGUILayout.EndVertical();
        
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//角色自动走路控制
public class FuWangController : MonoBehaviour
{
    public PathMgr pathMgr;
    public Animator anim;

    public int nextPoint = 0;
    public float moveSpeed;
    public float rotateSpeed;

    private bool isReturn;

    private int Run = Animator.StringToHash("Run");

    // Update is called once per frame
    void Update()
    {
        anim.SetBool(Run, true);
        Transform nextPath = pathMgr.pathPoints[nextPoint].trans;
        Debug.Log(nextPath.position);

        Vector3 dir = Vector3.Normalize(nextPath.position - transform.position);
        transform.position = transform.position + dir * Time.deltaTime * moveSpeed;
        dir.y = 0;
        Quaternion q = Quaternion.LookRotation(dir);
        transform.rotation = Quaternion.Slerp(transform.rotation, q, rotateSpeed * Time.deltaTime);

        if (nextPoint >= pathMgr.pathPoints.Count - 1) isReturn = true;
        if (nextPoint <= 0)  isReturn = false;

        if ((transform.position - nextPath.position).sqrMagnitude <0.1f)
        {
            if (!isReturn)
                nextPoint++;
            else nextPoint--;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值