您的位置:首页 > 移动开发 > Unity3D

Unity官方第一人称射击游戏<恶魔射手>_学习笔记三(敌人脚本)

2017-11-01 12:01 821 查看
敌人移动脚本

[RequireComponent(typeof(NavMeshAgent))]
public class MyEnemyMove : MonoBehaviour
{
Transform mMyHero;
//声明英雄、敌人生命值脚本在于它们决定了敌人的AI何时启动和终止
MyPlayerHealth _MyPlayerHealth;
MyEnemyHealth _MyEnemyHealth;
//内置寻路导航对象
NavMeshAgent _NavMeshAgent;
private void Awake()
{
mMyHero = GameObject.FindWithTag("MyHero").GetComponent<Transform>();
_NavMeshAgent = GetComponent<NavMeshAgent>();
_MyEnemyHealth = GetComponent<MyEnemyHealth>();
_MyPlayerHealth = mMyHero.GetComponent<MyPlayerHealth>();
}

private void Update()
{
//如果英雄、敌人自身都有生命值才开
4000
启寻路
if (_MyEnemyHealth.mCurrentHealth > 0 && _MyPlayerHealth.mCurrentHealth > 0)
{
_NavMeshAgent.SetDestination(mMyHero.position);
}
else
{
_NavMeshAgent.enabled = false;
}
}
}
较为简单,我直接贴出全部代码。

public class MyEnemyHealth : MonoBehaviour
{

public float mCurrentHealth;
Animator _Animator;
int _StartHealth = 100;
bool _IsDead;
bool _IsSkinking;
private void Awake()
{
mCurrentHealth = _StartHealth;
_Animator = GetComponent<Animator>();
}
private void Update()
{
//如果下沉条件成立
if (_IsSkinking)
{
transform.Translate(Vector3.down* Time.deltaTime);
}
}

public void TakeDamage(float amount)
{
//如果敌人死亡,便不再受到伤害
if (_IsDead)
return;
mCurrentHealth -= amount;

if (mCurrentHealth <= 0 && !_IsDead)
{
Dead();
}
}
private void Dead()
{
_IsDead = true;
_Animator.SetTrigger("Dead");
MyScoreManager.mScore += 10;    //在这里更新玩家分数
}

//该函数被"Dead"动画事件驱动
public void StartSinking()
{
//死亡动画开启,死亡敌人身体开始下沉
_IsSkinking = true;
gameObject.GetComponent<Rigidbody>().isKinematic = true;
Destroy(gameObject, 2);
}
}
同样直接贴出全部代码

下面的敌人攻击代码,相比较较为复杂,先贴出代码吧

public class MyEnemyAttack : MonoBehaviour
{
GameObject _Player;
MyPlayerHealth _MyPlayerHealth;
MyEnemyHealth _MyEnemyHealth;
Animator _Animator;
float _TimeBetweenAttack = 0.5f;    //攻击时间间隔
int _AttackDamage = 10; //攻击力
bool _IsPlayerInRange;  //英雄是否在攻击范围
float _Timer;
private void Awake()
{
_Player = GameObject.Find("MyHero");
_MyEnemyHealth = GetComponent<MyEnemyHealth>();
_MyPlayerHealth = _Player.GetComponent<MyPlayerHealth>();
_Animator = GetComponent<Animator>();
}
private void Update()
{
_Timer += Time.deltaTime;
if (_Timer > _TimeBetweenAttack && _MyEnemyHealth.mCurrentHealth > 0 && _MyPlayerHealth.mCurrentHealth > 0)
{
Attack();
}
if (_MyPlayerHealth.mCurrentHealth <= 0)
{
_Animator.SetTrigger("PlayerDead");
}
}
//英雄进入攻击范围
private void OnCollisionEnter(Collision collision)
{
if (collision.collider.gameObject == _Player.gameObject)
{
_IsPlayerInRange = true;
_Animator.SetTrigger("PlayerDead");
}
}
//英雄离开攻击范围
private void OnCollisionExit(Collision collision)
{
if (collision.collider.gameObject == _Player.gameObject)
{
_IsPlayerInRange = false;
}
}
private void Attack()
{
_Timer = 0;
//必须满足攻击范围要求,才可以攻击
if (_IsPlayerInRange)
{
_MyPlayerHealth.TakeDamage(_AttackDamage);
}
}
}
敌人攻击力逻辑其实很简单,敌人、英雄生命值、两者距离满足条件,此时可以给英雄造成伤害。

至此敌人相关的代码部分就结束了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 游戏