学习游戏制作记录(爆炸敌人的制作)
1.制作爆炸的光球
创建Expolsive_Controller脚本:
private Animator anim;//动画组件
private CharactorState myStats;//产生光球的实体状态
private float growSpeed = 10;//球的变大速度
private float maxSize = 6;//球的最大尺寸
private float ExplosiveRadius;//爆炸半径
private bool canGrow=true;//是否可以变大
private void Update()
{
if(canGrow)
{
transform.localScale = Vector2.Lerp(transform.localScale, new Vector2(maxSize, maxSize), growSpeed * Time.deltaTime);//变大
}
if(maxSize-transform.localScale.x < .5f )
{
canGrow = false;
anim.SetTrigger("Explode");//达到一定程度执行爆炸的动画
}
}
public void SetupExpolsve(CharactorState _mystats,float _growSpeed,float _maxSize,float _radius)//设置光球的参数
{
anim = GetComponent<Animator>();
myStats = _mystats;
growSpeed = _growSpeed;
maxSize = _maxSize;
ExplosiveRadius = _radius;
}
public void AnimationExplodeEvent()//爆炸伤害函数,在光球爆炸的时候调用该函数
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(transform.position, ExplosiveRadius);
foreach (var hit in collider2Ds)
{
if (hit.GetComponent<CharactorState>() != null)
{
hit.GetComponent<Entity>().SetupKnocbackDir(transform);
myStats.DoDamage(hit.GetComponent<CharactorState>());
}
}
}
public void SelfDestroy()=>Destroy(gameObject);//在光球消失的动画时销毁函数
2.制作爆炸敌人
依旧参考骷髅敌人的状态机
修改Enemy_Shady脚本:
[Header("Shady Spesifics")]
[SerializeField] public float BattleStateMoveSpeed;
[SerializeField] private GameObject explosivePrefab;
[SerializeField] private float growSpeed;
[SerializeField] private float maxSize;
idleState = new ShadyIdleState(enemyStateMachine, this, "Idle", this);
moveState = new ShadyMoveState(enemyStateMachine, this, "Move", this);
battleState = new ShadyBattleState(enemyStateMachine, this, "MoveFast", this);//这里用快速移动代替战斗状态
stunedState = new ShadyStunnedState(enemyStateMachine, this, "Stunned", this);
deadState = new ShadyDeadState(enemyStateMachine, this, "Dead", this);
public override void AnimationSpecialAttackTrigger()//在敌人执行爆炸动画即光球出现时调用该函数
{
GameObject newExplosive = Instantiate(explosivePrefab, attackCheck.position, Quaternion.identity);//产生光球
newExplosive.GetComponent<Expolsive_Controller>().SetupExpolsve(state, growSpeed, maxSize, attackCheckRadius);
cd.enabled = false;
rb.gravityScale = 0;
}
public void SelfDestroy() => Destroy(gameObject);//在敌人执行消失动画的最后一帧调用自毁函数
修改ShadyBattleState脚本:
public override void Update()
{
base.Update();
if (enemy.isPlayerDetected())
{
stateTimer = enemy.BattleTime;
if (enemy.isPlayerDetected().distance < enemy.attackDistance)//如果小于一定距离则使敌人爆炸
enemy.state.KillEntity();//这将使敌人进入死亡状态并使玩家获得灵魂
}
else
{
if (stateTimer < 0 || Vector2.Distance(player.position, enemy.transform.position) > 10)
{
enemy.enemyStateMachine.ChangeState(enemy.idleState);
}
}
if (player.position.x > enemy.transform.position.x)
{
moveDir = 1;
}
else if (player.position.x < enemy.transform.position.x)
{
moveDir = -1;
}
enemy.SetVelocity(moveDir * enemy.moveSpeed, rb.velocity.y);
}
ShadyDeadState脚本:
public override void Update()
{
base.Update();
if(triggerCalled)//动画触发到敌人消失
enemy.SelfDestroy();
}