Unity尝试制作王者荣耀笔记(十)小兵寻找攻击目标

小兵寻找攻击目标,消灭攻击目标后,获取下一个目标 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using Random = UnityEngine.Random;

public class SmartSolider : MonoBehaviour {

    public Transform target;
    private Animation ani;
    private NavMeshAgent nav;
    public Transform[] towers;
    public int type=0;
    private float distance;//小兵与箭塔的距离
    //敌人进入小兵攻击范围,就加载列表里面
    List<Transform> enemylist=new List<Transform>();

    private Health hp;
	// Use this for initialization
	void Start ()
    {
        hp = GetComponent<Health>();
        nav = GetComponent<NavMeshAgent>();
        ani = GetComponent<Animation>();
        target = GetTarget();
    }
	
	// Update is called once per frame
	void Update ()
    {
        SoliderMove();
    }

    void SoliderMove()
    {

        if (target==null)
        {
            //目标点为空,需要寻找一下目标点
            target = GetTarget();
            return;
        }
        
        ani.CrossFade("Run");
        nav.SetDestination(target.position);
        //通过距离判断小兵是否都攻击箭塔

        distance = Vector3.Distance(transform.position, target.position);
        if (distance>5)
        {
            nav.speed = 3.5f;//保持原速度前进
        }
        else
        {
            nav.speed = 0;//小兵停止前进
            Vector3 tarpos = target.position;
            Vector3 lookpos=new Vector3(tarpos.x,transform.position.y,tarpos.z);
            transform.LookAt(lookpos);//小兵看向炮塔,箭塔比较高,所以看向高度是小兵的高度
            ani.CrossFade("Attack1");
        }
    }
/// <summary>
/// 敌人进入小兵攻击范围,确定小兵攻击目标
/// </summary>
/// <param name="other"></param>
    private void OnTriggerEnter(Collider other)
    {
        //判断敌人是英雄还是小兵
        if(other.gameObject.tag=="Player"&&this.type==1)//针对于操作者玩家而言,敌方小兵会攻打玩家,玩家相对于敌方小兵是敌人
        {
            this.enemylist.Add(other.transform);
            Transform temp = enemylist[0];//取出列表的第一个作为攻击目标
            if (target==null||temp!=target)
            {
                target = temp;

            }
            
        }
        else 
        {
            SmartSolider solider = other.GetComponent<SmartSolider>();
            if (solider!=null
                &&solider.type!=this.type //确定是敌方
                &&!enemylist.Contains(other.transform))//检查敌人是否已经包含在敌人列表里,防止重复加入
            {
                enemylist.Add(other.transform);
                Transform temp = enemylist[0];
                if (target==null||temp!=target)
                {
                    target = temp;
                }
            }

        }

    }
/// <summary>
/// 敌人离开小兵攻击范围,从列表中移除
/// </summary>
/// <param name="other"></param>
    private void OnTriggerExit(Collider other)
    {
        if (enemylist.Contains(other.transform))
        {
            target = GetTarget();
        }


    }
/// <summary>
/// 小兵受伤害值
/// </summary>
public void Takedamage(float damaga)
{
    hp.hp.Value -= damaga;
    if (hp.hp.Value<=0)
    {
        Destroy(gameObject);
    }
}

//小兵开始攻击播放攻击动画,监听攻击事件
    public void Attack()
    {
       
        if (target==null)
        {
            target = GetTarget();
            return;
        }
        
        Health heal = target.GetComponent<Health>();
        if (heal!=null)
        {
            float damp = Random.Range(0.1f, 0.6f);
            heal.TakeDamage(damp);//攻击目标血量减少
            if (heal.hp.Value<=0)//当被攻击对象血量为0时
            {
                Destroy(target.gameObject);
                //移除目标对象,断这个target是兵还是炮塔,并移除
                if (this.enemylist.Contains(target)) 
                {
                    this.enemylist.Remove(target);
                }
                else
                {
                    DestroyTowerInList(target);
                }
                //上一个目标消灭掉,开始获取下一个目标
                target = GetTarget();
                if (target)
                {
                    nav.SetDestination(target.transform.position);
                    nav.speed=3.5f;
                    ani.CrossFade("Run");

                }
            }
        }

      

    }

   
    /// <summary>
    /// 当塔消失时,塔从列表中清除
    /// </summary>
    /// <param name="destroyTower"></param>
    void DestroyTowerInList(Transform detroyTower)
    {
        for (int i = 0; i <towers.Length; i++)
        {
            if (towers[i]==detroyTower)
            {
                towers[i] = null;
                return;
            }
        }
    }
    //假如小兵跑向的目标点是塔
    Transform GetTarget()
    {
        this.enemylist.RemoveAll(t=>t==null);//移除掉列表里所有为空的元素
        if (enemylist.Count > 0) //判断数组里是否有值
        {
            //直接拿第一个
            return enemylist[0];
        }
        for (int i=0;i<towers.Length;i++)
        {

            if (towers[i]!=null)
            {
                return towers[i];
            }
        }
        return null;
    }

    //设置小兵行走的路
    public void SetRoad(int road)
    {
      
        nav = GetComponent<NavMeshAgent>();
        nav.areaMask = road;
    }
}
发布了152 篇原创文章 · 获赞 24 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_40229737/article/details/105153028
今日推荐