本次完成伽雷斯的制作,强度较高,属于半个BOSS型
代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class JLS : ZombieBase
{
protected override int MaxHP => 1000;
protected override float speed => 3;
protected override float attackValue => 200;
protected override bool isSpecial => true;
protected override GameObject Prefab => GameManager.Instance.GameConf.JLS;
private Vector3 SummonOffset = new Vector3(1.5f, 0,0);
private bool isSummon = false;
public override void SpecialMove()
{
if (isSpeedUp) { nowSpeed = speed / SpeedRatio; StartCoroutine(StopSpeedUp()); }
else nowSpeed = speed;
if (spriteRenderer.color == new Color(0.16f, 0.17f, 0.74f)) nowSpeed = nowSpeed * 2;
if (currGrid == null) return;
currGrid = GridManager.Instance.GetGridByWorldPos(transform.position + (Vector3)offset);
if (currGrid.HavePlant
&& CurrGrid.CurrPlantBase.ZombieCanEat
&& currGrid.CurrPlantBase.transform.position.x < transform.position.x + ((Vector3)offset).x
&& transform.position.x + ((Vector3)offset).x - currGrid.CurrPlantBase.transform.position.x < 0.3f)
{
State = ZombieState.Attack;
return;
}
else if (currGrid.Point.x == 0 && currGrid.Position.x - transform.position.x - ((Vector3)offset).x > 1f)
{
Vector2 pos = transform.position + (Vector3)offset;
Vector2 target = new Vector2(-9.17f, -1.37f);
Vector2 dir = (target - pos).normalized * 3f;
transform.Translate((dir * (Time.deltaTime / 1)) / nowSpeed);
if (Vector2.Distance(target, pos) < 0.05f)
{
LVManager.Instance.GameOver();
}
return;
}
if (animator.GetCurrentAnimatorStateInfo(0).IsName("JLS_Summon")) return;
else
{
transform.Translate((new Vector2(-1.33f, 0) * (Time.deltaTime / 1)) / nowSpeed);
}
}
public override void InitZombieHpState()
{
zombieHpState = new ZombieHpState(
0,
new List<int>() { MaxHP, 600, 300, 100 },
new List<string>() { "JLS_Walk", "JLS_Walk", "JLS_Walk", "JLS_Walk" },
new List<string>() { "JLS_Attack", "JLS_Attack", "JLS_Attack", "JLS_Attack" },
new List<UnityAction>() { CheckState, Summon, Summon, CheckState }
);
}
private void Summon()
{
if (!isSummon)
{
isSummon = true;
animator.Play("JLS_Summon");
AudioManager.Instance.PlayEFAudio(GameManager.Instance.GameConf.JLS_laugh);
StartCoroutine(CheckSummon());
}
}
IEnumerator CheckSummon()
{
while (true)
{
yield return new WaitForSeconds(0.05f);
if (animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1)
{
ZombieManager.Instance.CreatSacrifice((int)currGrid.Point.y, transform.position-SummonOffset);
ZombieManager.Instance.CreatSacrifice((int)currGrid.Point.y, transform.position+SummonOffset);
ZombieManager.Instance.CreatUnDieZombie((int)currGrid.Point.y + 1, transform.position);
ZombieManager.Instance.CreatUnDieZombie((int)currGrid.Point.y - 1, transform.position);
CheckState();
isSummon = false;
break;
}
}
}
public override void OnDead()
{
isSummon = false;
if (!isSpecialDie)
{
JLS_Diebody body = PoolManager.Instance.GetObj(GameManager.Instance.GameConf.JLS_Diebody).GetComponent<JLS_Diebody>();
body.Init(animator.transform.position + (Vector3)offset);
}
}
}