敌人工厂,设置随机角度出现的敌人预设体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyFactory : MonoBehaviour
{
[Header("敌人预设体")]
public GameObject enemyPre;
[Header("时间间隔")]
public float interval;
[Header("最大敌人数量")]
public int maxCount;
//当前数量
private int currentCount;
//玩家
private GameObject player;
//计时器
private float timer;
private void Start()
{
//获取玩家
player = GameObject.FindWithTag("Player");
}
private void Update()
{
//如果玩家为空
if (player==null)
{
return;
}
//时间
timer += Time.deltaTime;
//生成的数量比最大容量大
if (currentCount>maxCount)
//返回
return;
//如果时间大于间隔时间
if (timer > interval)
{
//在范围内生成敌人
GameObject obj= Instantiate(enemyPre, new Vector3(Random.Range(1, 10), 0.3f,
Random.Range(20, 25)), Quaternion.Euler(0,Random.Range(0,360),0));
//敌人数量++
currentCount++;
//时间为零
timer = 0;
}
}
}
敌人移动,攻击,转身朝人移动,自由移动,当时间大于间隔时间的时候,随机一个角度转化成四元数,然后随即旋转,进行移动
当和玩家的距离小于移向玩家的距离的时候 获取与玩家的方向向量,并将其转化成需要转向的目标四元数,进行转向,然后当旋转角度大于5时候,直接返回,否则就向玩家移动
攻击的时候,向目标开始转向,当角度小于五度时,直接开炮
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpiderMove : MonoBehaviour
{
//移动速度
[Range(0,10)]
public float moveSpeed;
//旋转速度
[Range(0,10)]
public float turnSpeed;
//设置随机四元数
private Quaternion qua;
//设置计时器
private float timer;
//设置时间间隔
private float interval=3;
//声明玩家
private GameObject player;
//设置目标与自身的向量
private float distance;
//设置方向向量
private Vector3 dir;
public Animator _animator;
public GameObject attackPre;
private void Start()
{
//获取玩家
player=GameObject.FindWithTag("Player");
_animator = GetComponent<Animator>();
}
private void Update()
{
//如果玩家不存在
if (player==null)
{
//随即移动转身
RandomMove();
return;
}
//获取与玩家的距离
distance = Vector3.Distance(transform.position ,player.transform.position);
//如果距离小于四
if (distance<1f)
{
//攻击
Attack();
}
//如果距离小于十
else if (distance<4)
{
//移向玩家
MovetoPlayer();
}
else
{
//随即移动转身
RandomMove();
}
}
/// <summary>
/// 随机移动转身
/// </summary>
private void RandomMove()
{
//时间
timer += Time.deltaTime;
//时间大于间隔时间
if (timer>interval)
{
//随机一个角度
float y = Random.Range(1, 360);
//欧拉角转成四元数
qua=Quaternion.Euler(Vector3.up*y);
//将time返回为0
timer = 0;
}
//随机旋转
transform.rotation = qua;
//移动
transform.position += transform.forward * Time.deltaTime * moveSpeed;
}
/// <summary>
/// 移向玩家
/// </summary>
private void MovetoPlayer()
{
//获取与玩家的方向向量
dir = player.transform.position - transform.position;
//获取要转向的目标四元数
Quaternion qua = Quaternion.LookRotation(dir);
//向目标开始转向
transform.rotation = Quaternion.Lerp(transform.rotation, qua, Time.deltaTime * turnSpeed);
//当转向的角度大于五度时
if (Quaternion.Angle(transform.rotation, qua) > 5)
//返回
return;
//向玩家移动
transform.position=Vector3.Lerp(transform.position,player.transform.position,
Time.deltaTime*moveSpeed);
}
/// <summary>
/// 攻击
/// </summary>
private void Attack()
{
//时间
timer += Time.deltaTime;
//获取与玩家的方向向量
dir = player.transform.position - transform.position;
//获取要转向的目标四元数
Quaternion qua = Quaternion.LookRotation(dir);
//向目标开始转向
transform.rotation = Quaternion.Lerp(transform.rotation, qua, Time.deltaTime * turnSpeed);
//当转向的角度大于五度时
if(Quaternion.Angle(transform.rotation,qua)>5)
//返回
return;
//如果时间大于1
if (timer>1)
{
_animator.SetTrigger("attack");
timer = 0;
}
}
}
敌人受伤害
当玩家为空时直接返回,ui血条始终朝向摄像机,血条的位置就为敌人的位置,防止敌人掉下去还存在,当敌人的y轴小于-10时,直接销毁。
然后判断敌人和人物的特效相触发,触发不同的特效,受到的伤害也不一样,生成ui文字的伤害预设体中的伤害文字方法,将其受到 的伤害传入其中,记录每个时候剩余血量与原血量的比值
当血量小于零时,将其销毁并将后面任务所需的杀死怪的数量++ 并且在动画事件中将其特效传进来
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Random = UnityEngine.Random;
public class EnemyShowNameBlood : MonoBehaviour
{
private Scrollbar _scrollbar;
private SpiderMove _spiderMove;
private HeroProperty _heroProperty;
public GameObject attackTextPre;
//收到的伤害
private int damage;
public GameObject enemyPre;
public int hp;
//承接大小
private float a=1;
private float _timer;
private AllTask _allTask;
void Start ()
{
//根据Tag得到主角对象
_scrollbar = transform.GetChild(2).GetChild(0).GetComponent<Scrollbar>();
_spiderMove = GetComponent<SpiderMove>();
_heroProperty = GameObject.FindWithTag("Property").GetComponent<HeroProperty>();
_allTask = GameObject.Find("CanvasScene").transform.GetChild(0).GetChild(7).GetComponent<AllTask>();
}
void Update ()
{
if (gameObject==null)
{
return;
}
_scrollbar.transform.LookAt(Camera.main.transform);
_scrollbar.transform.position = new Vector3(transform.position.x,transform.position.y+0.8F,transform.position.z);
if (transform.position.y<-10)
{
Destroy(gameObject);
}
_scrollbar.size = Mathf.Lerp(_scrollbar.size, a, 5 * Time.deltaTime);
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("PlayerSlash1"))
{
damage = Random.Range(_heroProperty.attack - 20, _heroProperty.attack + 20);
hp -= damage;
gameObject.GetComponent<SpiderMove>()._animator.SetTrigger("damage");
GameObject attackText1 = Instantiate(attackTextPre, transform.position, Quaternion.identity);
attackText1.GetComponent<AttackText>().ShowDamage(damage);
a -= (float)damage/hp;
if (hp<0)
{
_spiderMove._animator.SetTrigger("die");
Destroy(gameObject,1);
_allTask.enemyNum++;
}
}
if (other.gameObject.CompareTag("PlayerSlash2"))
{
damage = Random.Range(_heroProperty.attack +50, _heroProperty.attack + 80);
gameObject.GetComponent<SpiderMove>()._animator.SetTrigger("damage");
GameObject attackText2 = Instantiate(attackTextPre, transform.position, Quaternion.identity);
attackText2.GetComponent<AttackText>().ShowDamage(damage);
hp -= damage;
a -= (float)damage/hp;
if (hp<0)
{
_spiderMove._animator.SetTrigger("die");
Destroy(gameObject,1);
_allTask.enemyNum++;
}
}
if (other.gameObject.CompareTag("PlayerSlash4"))
{
damage = Random.Range(_heroProperty.attack + 200, _heroProperty.attack + 300);
hp -= damage;
gameObject.GetComponent<SpiderMove>()._animator.SetTrigger("damage");
GameObject attackText2 = Instantiate(attackTextPre, transform.position, Quaternion.identity);
attackText2.GetComponent<AttackText>().ShowDamage(damage);
a -= (float)damage/hp;
if (hp<0)
{
_spiderMove._animator.SetTrigger("die");
Destroy(gameObject,1);
_allTask.enemyNum++;
}
}
}
private void OnTriggerStay(Collider other)
{
if (other.gameObject.CompareTag("PlayerSlash3"))
{
_timer += Time.deltaTime;
if (_timer>=0.4f)
{
damage = Random.Range(_heroProperty.attack-70 , _heroProperty.attack-50 );
hp -= damage;
gameObject.GetComponent<SpiderMove>()._animator.SetTrigger("damage");
GameObject attackText2 = Instantiate(attackTextPre, transform.position, Quaternion.identity);
attackText2.GetComponent<AttackText>().ShowDamage(damage);
_timer = 0;
a -= (float)damage/hp;
if (hp<0)
{
_spiderMove._animator.SetTrigger("die");
Destroy(gameObject,1);
_allTask.enemyNum++;
}
}
}
}
//动画事件
public void AttackPlayer(GameObject _obj)
{
GameObject obj = Instantiate(_obj,
transform.position, _obj.transform.rotation);
Destroy(obj,0.5f);
}
}