怪物可以自行溜达,Player移动受玩家控制,当两者距离近到一定程度,怪物便会追Player,当距离超过跟随范围,怪物便不会追Player。用到了射线检测。
绿色的是玩家控制的Player,红色的是Enemy。
玩家移动代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PuayerMove : MonoBehaviour
{
void Start ()
{
}
void Update ()
{
//获取移动向量
//获取水平轴
float horizontal = Input.GetAxis("Horizontal");
//获取垂直轴
float vertical = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(horizontal, 0, vertical);
if (dir != Vector3.zero)
{
//转向
Quaternion q = Quaternion.LookRotation(dir);
//只用插值动作更加平滑
transform.rotation = Quaternion.Lerp(transform.rotation, q, 0.1f);
//前进
transform.Translate(Vector3.forward * 2 * Time.deltaTime);
}
}
}
敌人代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyControl : MonoBehaviour
{
//可以移动的点
private Transform movePoints;
//将要移动到的点
private Transform nextPoint;
//玩家的点
private Transform playerPoint;
void Start ()
{
movePoints = GameObject.Find("MovePoints").transform;
playerPoint = GameObject.FindWithTag("Player").transform;
RefreshPoint();
}
void Update ()
{
//获得和玩家的距离
float playerDis = Vector3.Distance(transform.position, playerPoint.position);
//判断和玩家之间有没有障碍
Ray ray = new Ray(transform.position + Vector3.up * 0.5f, playerPoint.position - transform.position);
bool res = Physics.Raycast(ray, Vector3.Distance(transform.position, playerPoint.position), 1 << LayerMask.NameToLayer("Wall"));
//如果距离小于3并且和玩家之间没障碍,我们就向玩家移动
if (playerDis < 3 && res == false)
{
nextPoint = playerPoint;
}
//点
//获取和目标点的距离
float pointDis = Vector3.Distance(transform.position, nextPoint.position);
//如果距离小于0.3f,寻找下一个目标点,保证和玩家距离大于2
if (pointDis <= 0.6f && playerDis > 2f)
{
RefreshPoint();
}
//如果正在追击玩家,距离过远,丢失追击,更改目标
if (nextPoint.position == playerPoint.position && playerDis > 4)
{
RefreshPoint();
}
//离下个目标点的距离
pointDis = Vector3.Distance(transform.position, nextPoint.position);
//向目标点前进
if (pointDis > 0.6f)
{
transform.LookAt(nextPoint.position + Vector3.up * 0.5f);
transform.Translate(Vector3.forward * 1 * Time.deltaTime);
}
}
//刷新下一个点的位置
void RefreshPoint()
{
List<Transform> points = new List<Transform>();
//遍历子节点
foreach (Transform trans in movePoints)
{
//射线
Ray ray = new Ray(transform.position + Vector3.up * 0.5f, trans.position - transform.position);
bool res = Physics.Raycast(ray, Vector3.Distance(transform.position, trans.position));
if (res == false)
{
points.Add(trans);
}
if (points.Count > 0)
{
nextPoint = points[Random.Range(0, points.Count)];
}
}
}
}