常用脚本(十九)Unity_Enemy Flow Player

怪物可以自行溜达,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)];
            }
        }
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值