简单的寻路及路径点编辑
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--;
}
}
}