| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114 |
- using Spine.Unity;
- using Spine;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using Base.Common;
- using UnityEditor.SceneManagement;
- public enum TargetType
- {
- None = 0,
- Demonic = 1,
- Tower = 2,
- Player = 3,
- Enemy = 4,
- EnemyTower = 5,
- Boss = 6,
- Portal = 7,
- }
- public enum SearchState
- {
- NoTarget = 0, //搜索范围内没有目标
- InSearchScope = 1, //在搜索范围内发现目标,但不在攻击范围内
- InAttackScope = 2, //目标在攻击范围内
- }
- public class Enemy : MoveCharacter
- {
- [Header("敌方单位属性")]
- public int id;
- public int sortingOrder = 0;
- public bool canFly = false;
- public bool isBack = false; //往反方向走
- public float flyHeight;
- public float flyUpSpeed = 10;
- public float jumpSpeed = 10;
- public float maxMoveSpeed, minMoveSpeed;
- public float runSpeed;
- [Header("敌方英灵")]
- public Spirits.SpiritType type;
- [Header("敌方单位组件")]
- public SearchState searchState;
- [Header("攻击")]
- public float attackDistance;
- public float maxAttackDis, minAttackDis;
- public bool needToChange;
- public float attackRatio;
- [Header("掉落魂")]
- public int dropSoulMax = 3;
- public int dropSoulMin = 1;
- public float dropSoulAngle = 60f;
- [Header("冲刺攻击")]
- public GameObject aimEffect;
- public DashEffect dashEffect;
- [HideInInspector]
- public bool noOnSearchState;
- [HideInInspector]
- public bool isFindingPlayer;
- [HideInInspector]
- public bool isFindPlayer;
- public float hateDistance;
- [HideInInspector]
- public float distance;
- [HideInInspector]
- public Vector3 rushEndPos;
- public float aimDistance;
- public float rushTime;
- public float rushSpeed;
- [HideInInspector]
- public float time;
- public float readyCD;
- [HideInInspector]
- public Vector3 targetDir;
- public bool haveDownRush; //冲刺结束后是否可以接落地斩
- public bool rushHaveAttack; //冲刺是否带伤害
- public float downRushTime;
- public float finishRushTime;
- private void Awake()
- {
- aimDistance = rushTime * rushSpeed / 2;
- }
- private void Start()
- {
- if (needToChange)
- {
- attackDistance = Random.Range(minAttackDis, maxAttackDis);
- }
- }
- public void OnDisable()
- {
- EnemyCreater.instance.OnEnemyRecycle(this);
- }
- public override void Init()
- {
- base.Init();
- moveSpeed = Random.Range(minMoveSpeed, maxMoveSpeed);
- ChangeSearchState(SearchState.NoTarget);
- }
- public override void FixedUpdate()
- {
- if (!noOnSearchState)
- {
- OnSearchState();
- }
- OnState();
- }
- public override Vector3 GetMoveDir()
- {
- Vector3 moveDir = Vector3.zero;
- if (canMove)
- {
- switch (searchState)
- {
- case SearchState.NoTarget:
- if (TowerMap.myTowers.Count == 0)
- {
- moveDir = Vector3.right;
- break;
- }
- float minDistance = Mathf.Infinity;
- int id = -1;
- for (int i = 0; i < TowerMap.myTowers.Count; i++)
- {
- Tower myTower = TowerMap.myTowers[i].GetComponent<Tower>();
- if (transform.position.y >
- myTower.transform.position.y + myTower.height)
- {
- continue;
- }
- float distance = Vector3.Distance(transform.position,
- TowerMap.myTowers[i].transform.position);
- if (distance < minDistance)
- {
- minDistance = distance;
- id = i;
- }
- }
- if (id == -1)
- {
- moveDir = Vector3.right;
- break;
- }
- if (bodyTrans.position.x > TowerMap.myTowers[id].transform.position.x)
- {
- moveDir = Vector3.left;
- }
- else
- {
- moveDir = Vector3.right;
- }
-
- break;
- case SearchState.InSearchScope:
- if (targetCharacter)
- {
- if (targetCharacter.transform.position.x - transform.position.x < 0)
- {
- moveDir = Vector3.left;
- }
- else
- {
- moveDir = Vector3.right;
- }
- }
- else
- {
- moveDir = Vector3.zero;
- }
- break;
- case SearchState.InAttackScope:
- if (targetCharacter)
- {
- if (targetCharacter.transform.position.x - transform.position.x < 0)
- {
- moveDir = Vector3.left;
- }
- else
- {
- moveDir = Vector3.right;
- }
- }
- else
- {
- moveDir = Vector3.zero;
- }
- break;
- default:
- break;
- }
- }
- if (!isBack)
- {
- return moveDir;
- }
- return -moveDir;
- }
- public bool GetAttack()
- {
- if (searchState == SearchState.InAttackScope)
- {
- return true;
- }
- return false;
- }
- public bool GetJump()
- {
- return false;
- }
- public void AdjustHeight()
- {
- if (canFly)
- {
- if (transform.position.y - flyHeight > 0.1f)
- {
- Vector3 pos = transform.position;
- pos.y -= flyUpSpeed * Time.deltaTime;
- transform.position = pos;
- }
- else if (transform.position.y - flyHeight < -0.1f)
- {
- Vector3 pos = transform.position;
- pos.y += flyUpSpeed * Time.deltaTime;
- transform.position = pos;
- }
- }
- }
- public override void OnState()
- {
- base.OnState();
- //hurtKeepTime -= Time.deltaTime;
- attackTime -= Time.deltaTime;
- dieKeepTime -= Time.deltaTime;
- invincibleTime -= Time.deltaTime;
- weakTime -= Time.deltaTime;
- beRepelValue += Time.deltaTime;
- Vector3 leftDir = GetMoveDir();
- bool isAttack = GetAttack();
- switch (state)
- {
- case CharacterState.Idle:
- if (isAttack)
- {
- Attack2();
- break;
- }
- if (!foot.TrigGround && !canFly)
- {
- if (rb.velocity.y > 0)
- {
- ChangeState(CharacterState.Rise);
- break;
- }
- else
- {
- ChangeState(CharacterState.Fall);
- break;
- }
- }
- if (leftDir.x > 0.3f || leftDir.x < -0.3f)
- {
- ChangeState(CharacterState.Run);
- break;
- }
- //rb.velocity = Vector3.zero;
- AdjustHeight();
- break;
- case CharacterState.Run:
- if (isAttack)
- {
- Attack2();
- break;
- }
- if (!foot.TrigGround && !canFly)
- {
- if (rb.velocity.y > 0)
- {
- ChangeState(CharacterState.Rise);
- break;
- }
- else
- {
- ChangeState(CharacterState.Fall);
- break;
- }
- }
- if (leftDir.x < 0.3f && leftDir.x > -0.3f)
- {
- ChangeState(CharacterState.Idle);
- break;
- }
- if (leftDir.x > 0.3f)
- {
- rb.velocity = Vector3.right * moveSpeed;
- if (bodyTrans.localScale.x > 0)
- {
- Turn();
- }
- }
- else if (leftDir.x < -0.3f)
- {
- rb.velocity = Vector3.left * moveSpeed;
- if (bodyTrans.localScale.x < 0)
- {
- Turn();
- }
- }
- AdjustHeight();
- break;
- case CharacterState.Rush:
- if (isAttack)
- {
- Attack2();
- break;
- }
- if (!foot.TrigGround && !canFly)
- {
- if (rb.velocity.y > 0)
- {
- ChangeState(CharacterState.Rise);
- break;
- }
- else
- {
- ChangeState(CharacterState.Fall);
- break;
- }
- }
- if (leftDir.x < 0.3f && leftDir.x > -0.3f)
- {
- ChangeState(CharacterState.Idle);
- break;
- }
- if (leftDir.x > 0.3f)
- {
- //rb.velocity += Vector3.right * moveAcc * Time.deltaTime;
- rb.velocity = Vector3.right * runSpeed;
- //if (rb.velocity.x > maxMoveSpeed)
- //{
- // rb.velocity = new Vector3(maxMoveSpeed, rb.velocity.y, rb.velocity.z);
- //}
- if (bodyTrans.localScale.x > 0)
- {
- Turn();
- }
- }
- else if (leftDir.x < -0.3f)
- {
- //rb.velocity -= Vector3.right * moveAcc * Time.deltaTime;
- rb.velocity = Vector3.left * runSpeed;
- //if (rb.velocity.x < -maxMoveSpeed)
- //{
- // rb.velocity = new Vector3(-maxMoveSpeed, rb.velocity.y, rb.velocity.z);
- //}
- if (bodyTrans.localScale.x < 0)
- {
- Turn();
- }
- }
- AdjustHeight();
- break;
- case CharacterState.Rise:
- if (rb.velocity.y <= 0)
- {
- ChangeState(CharacterState.Fall);
- break;
- }
- rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
- break;
- case CharacterState.Fall:
- if (foot.TrigGround || canFly)
- {
- if (isFindingPlayer)
- {
- ChangeState(CharacterState.FindPlayer);
- }
- else
- {
- ChangeState(CharacterState.Idle);
- }
- break;
- }
- Vector3 velocity = rb.velocity;
- velocity.y += extraFallGravity * Time.deltaTime;
- if (leftDir.x > 0.3f)
- {
- velocity.x = moveSpeed;
- if (bodyTrans.localScale.x > 0)
- {
- Turn();
- }
- }
- else if (leftDir.x < -0.3f)
- {
- velocity.x = - moveSpeed;
- if (bodyTrans.localScale.x < 0)
- {
- Turn();
- }
- }
- rb.velocity = velocity;
- break;
- case CharacterState.Attack:
- if (attackTime <= 0)
- {
- ChangeState(CharacterState.Idle);
- break;
- }
- break;
- case CharacterState.Die:
- if (dieKeepTime <= 0)
- {
- gameObject.SetActive(false);
- break;
- }
- break;
- case CharacterState.Weak:
- if(rb.velocity.magnitude > 1)
- {
- if(ani.GetCurrentAnimatorClipInfo(0)[0].clip.name != "hitted")
- {
- ani.Play("hitted",0,0);
- aniCollider.Play("Hurt",0,0);
- }
- Vector3 vel = rb.velocity;
- if (!canFly)
- {
- if (foot.TrigGround && vel.y < 0)
- {
- vel.y = 0;
- }
- else
- {
- vel += Vector3.up * extraFallGravity * Time.deltaTime;
- }
-
- }
- vel.y = vel.y * (1 - decelerationRatio * Time.deltaTime);
- vel.x = vel.x * (1 - decelerationRatio * Time.deltaTime);
- rb.velocity = vel;
- }
- else
- {
- if (ani.GetCurrentAnimatorClipInfo(0)[0].clip.name != "weak")
- {
- ani.Play("weak",0,0);
- aniCollider.Play("Weak",0,0);
- rb.velocity = Vector3.zero;
- }
- }
- if (weakTime <= 0)
- {
- ChangeState(CharacterState.Idle);
- break;
- }
- break;
- case CharacterState.Coma:
- pastComaTime += Time.deltaTime;
- if (pastComaTime >= comaTime)
- {
- ChangeState(CharacterState.Idle);
- }
- break;
- case CharacterState.FindPlayer:
- if (!isFindPlayer)
- {
- if (!foot.TrigGround && !canFly)
- {
- if (rb.velocity.y > 0)
- {
- ChangeState(CharacterState.Rise);
- break;
- }
- else
- {
- ChangeState(CharacterState.Fall);
- break;
- }
- }
- if(targetCharacter == null)
- {
- ChosePlayer();
- if(targetCharacter == null)
- {
- ChangeState(CharacterState.FinishRush);
- time = finishRushTime;
- break;
- }
- }
- else
- {
- if (targetCharacter.isRevive ||
- targetCharacter.GetComponent<PlayerController>().isBaseBtnOut)
- {
- targetCharacter = null;
- break;
- }
- }
- if (Mathf.Abs(transform.position.x-targetCharacter.transform.position.x)
- < hateDistance)
- {
- rushEndPos = targetCharacter.transform.position;
- isFindPlayer = true;
- break;
- }
- if (targetCharacter.transform.position.x > transform.position.x)
- {
- rb.velocity = Vector3.right * moveSpeed;
- if (bodyTrans.localScale.x > 0)
- {
- Turn();
- }
- }
- if (targetCharacter.transform.position.x < transform.position.x)
- {
- rb.velocity = Vector3.left * moveSpeed;
- if (bodyTrans.localScale.x < 0)
- {
- Turn();
- }
- }
- }
- break;
- case CharacterState.ReadyToRush:
- time += Time.deltaTime;
- if (time >= readyCD)
- {
- time = 0;
- if (rushHaveAttack)
- {
- ChangeState(CharacterState.RushAttack);
- }
- else
- {
- ChangeState(CharacterState.Rush);
- }
- }
- break;
- case CharacterState.RushAttack:
- time += Time.deltaTime;
- dashEffect.canHit = true;
- Rush();
- if (time >= rushTime)
- {
- time = 0;
- if (haveDownRush)
- {
- if (foot.TrigGround)
- {
- ChangeState(CharacterState.FinishRush);
- }
- else
- {
- ChangeState(CharacterState.ReadyToDownRush);
- }
- }
- else
- {
- ChangeState(CharacterState.FinishRush);
- }
- }
- break;
- case CharacterState.ReadyToDownRush:
- time += Time.deltaTime;
- if (time >= downRushTime)
- {
- time = 0;
- ChangeState(CharacterState.DownRush);
- }
- break;
- case CharacterState.DownRush:
-
- if (transform.position.y > 0)
- {
- dashEffect.canHit = true;
- Rush();
- }
- if (foot.TrigGround || transform.position.y <= -1)
- {
- ChangeState(CharacterState.FinishRush);
- }
- break;
- case CharacterState.FinishRush:
- time += Time.deltaTime;
- if (time > finishRushTime)
- {
- time = 0;
- ChangeState(CharacterState.Idle);
- }
- break;
- default:
- break;
- }
- }
- public override void ChangeState(CharacterState newState)
- {
- if (state == newState)
- {
- return;
- }
- switch (state)
- {
- case CharacterState.Idle:
- break;
- case CharacterState.Run:
- rb.velocity = Vector3.zero;
- break;
- case CharacterState.Rush:
- rb.velocity = Vector3.zero;
- break;
- case CharacterState.Rise:
- if (!canFly)
- {
- bodyCollider.SetActive(true);
- }
- break;
- case CharacterState.Fall:
- rb.velocity = Vector3.zero;
- break;
- //case CharacterState.Hurt:
- // break;
- case CharacterState.Attack:
- aniCollider.Play("NotAttack", 1, 0);
- break;
- case CharacterState.Die:
- isDie = false;
- break;
- case CharacterState.Weak:
- beRepelValue = totalBeRepelValue;
- break;
- case CharacterState.Float:
- canMove = true;
- break;
- case CharacterState.Coma:
- canMove = true;
- break;
- case CharacterState.FindPlayer:
- noOnSearchState = false;
- rb.velocity = Vector3.zero;
- isFindPlayer = false;
- break;
- case CharacterState.ReadyToRush:
- time = 0;
- aimEffect.SetActive(false);
- aimEffect.transform.localScale = Vector3.zero;
- rb.constraints =
- RigidbodyConstraints.FreezePositionZ | RigidbodyConstraints.FreezeRotation;
- break;
- case CharacterState.RushAttack:
- time = 0;
- dashEffect.canHit = false;
- rb.velocity = Vector3.zero;
- bodyTrans.rotation = Quaternion.Euler(Vector3.zero);
- break;
- case CharacterState.ReadyToDownRush:
- time = 0;
- rb.constraints =
- RigidbodyConstraints.FreezePositionZ | RigidbodyConstraints.FreezeRotation;
- break;
- case CharacterState.DownRush:
- dashEffect.canHit = false;
- rb.velocity = Vector3.zero;
- bodyTrans.rotation = Quaternion.Euler(Vector3.zero);
- if (foot.trigGroundList.Count == 0)
- {
- transform.position = new Vector3(transform.position.x, -1, 0);
- }
- else
- {
- transform.position = new Vector3(transform.position.x,
- foot.trigGroundList[0].transform.position.y, 0);
- }
- break;
- case CharacterState.FinishRush:
- time = 0;
-
- searchState = SearchState.NoTarget;
- noOnSearchState = false;
- ani.Play("idle", 0, 0);
- aniCollider.Play("Idle", 0, 0);
- break;
- default:
- break;
- }
- CharacterState oldState = state;
- state = newState;
- switch (newState)
- {
- case CharacterState.Idle:
- ani.Play("idle", 0, 0);
- aniCollider.Play("Idle", 0, 0);
- rb.velocity = Vector3.zero;
- //animalAni.SetInteger("state", (int)PlayerState.Idle);
- break;
- case CharacterState.Run:
- ani.Play("walk", 0, 0);
- aniCollider.Play("Walk", 0, 0);
- //animalAni.SetInteger("state", (int)PlayerState.Walk);
- break;
- case CharacterState.Rush:
- ani.Play("rush", 0, 0);
- aniCollider.Play("Rush", 0, 0);
- break;
- case CharacterState.Rise:
- aniCollider.Play("Rise", 0, 0);
- break;
- case CharacterState.Fall:
- aniCollider.Play("Fall", 0, 0);
- break;
- case CharacterState.Float:
- canMove = false;
- break;
- case CharacterState.Coma:
- //ani.Play("Coma", 0, 0);
- ani.Play("idle", 0, 0);
- aniCollider.Play("Idle", 0, 0);
- rb.velocity = Vector3.zero;
- pastComaTime = 0;
- break;
- case CharacterState.Attack:
- break;
- case CharacterState.Die:
- ani.Play("die", 0, 0);
- aniCollider.Play("Die", 0, 0);
- isDie = true;
- dieKeepTime = totalDieKeepTime;
- DropSouls();
- if (linked)
- {
- PlayersInput.instance[0].sprintLinkTrigger.linkedEnemy.Remove(this);
- PlayersInput.instance[0].playerRope.gameObject.SetActive(false);
- }
- break;
- case CharacterState.Weak:
- switch (oldState)
- {
- case CharacterState.ReadyToRush:
- case CharacterState.RushAttack:
- case CharacterState.ReadyToDownRush:
- case CharacterState.DownRush:
- case CharacterState.Rush:
- state = oldState;
- beRepelValue = totalBeRepelValue;
- break;
- default:
- weakTime = totalWeakTime;
- //hurtKeepTime = minHurtKeepTime;
- break;
- }
- break;
- case CharacterState.FindPlayer:
- isFindPlayer = false;
- isFindingPlayer = true;
- noOnSearchState = true;
- ChosePlayer();
- ani.Play("walk", 0, 0);
- aniCollider.Play("Walk", 0, 0);
- break;
- case CharacterState.ReadyToRush:
- time = 0;
- canNotChangeHurt = true;
- ani.Play("charge", 0, 0);
- aimEffect.SetActive(true);
- rb.constraints = RigidbodyConstraints.FreezeAll;
- ReadyToDash(rushEndPos + Vector3.up, transform.position + Vector3.up);
-
- break;
- case CharacterState.RushAttack:
-
- targetDir =
- (rushEndPos - transform.position).normalized;
- ani.Play("rush_attack", 0, 0);
- break;
- case CharacterState.ReadyToDownRush:
- time = 0;
- rb.constraints = RigidbodyConstraints.FreezeAll;
- ani.Play("charge", 0, 0);
- break;
- case CharacterState.DownRush:
- time = 0;
- targetDir = Vector3.down;
- ani.Play("rush_attack", 0, 0);
- break;
- case CharacterState.FinishRush:
- time = 0;
- if (oldState == CharacterState.DownRush)
- {
- ani.Play("fall_end", 0, 0);
- }
- else
- {
- ani.Play("idle", 0, 0);
- aniCollider.Play("Idle", 0, 0);
- }
- canNotChangeHurt = false;
- break;
- default:
- break;
- }
- }
- public void DropSouls()
- {
- int dropSoulNum = Random.Range(dropSoulMin, dropSoulMax+1);
- if (dropSoulNum > 1)
- {
- for (int i = 0; i < dropSoulNum; i++)
- {
- float angleInterval = dropSoulAngle / (float)(dropSoulNum - 1);
- float angle = 90 + ((float)i - (float)(dropSoulNum - 1) / 2) * angleInterval;
- angle = angle / 180 * Mathf.PI;
- GameObject soulObj = PoolManager.Instantiate(soulPrefab, transform.position);
- Vector3 dir = new Vector3(Mathf.Cos(angle), Mathf.Sin(angle), 0);
- Soul soul = soulObj.GetComponent<Soul>();
- soul.Burst(dir * soulStartSpeed);
- soul.type = (int)type;
- }
- }
- else
- {
- GameObject soulObj = PoolManager.Instantiate(soulPrefab, transform.position);
- Vector3 dir = Vector3.up;
- Soul soul = soulObj.GetComponent<Soul>();
- soul.Burst(dir * soulStartSpeed);
- soul.type = (int)type;
- }
- }
- public void Jump()
- {
- SetUpSpeed(jumpSpeed);
- ani.Play("jump", 0, 0);
- }
- public void SetUpSpeed(float speed)
- {
- ChangeState(CharacterState.Rise);
- Vector3 velocity = rb.velocity;
- Vector3 leftDir = GetMoveDir();
- if (leftDir.x > 0.3f)
- {
- if (bodyTrans.localScale.x > 0)
- {
- Turn();
- }
- }
- else if (leftDir.x < -0.3f)
- {
- if (bodyTrans.localScale.x < 0)
- {
- Turn();
- }
- }
- velocity.y = speed;
- rb.velocity = velocity;
- //animalAni.SetInteger("state", (int)PlayerState.Rise);
- }
- public void ChangeSearchState(SearchState newState)
- {
- switch (searchState)
- {
- case SearchState.NoTarget:
- break;
- case SearchState.InSearchScope:
- break;
- case SearchState.InAttackScope:
- break;
- default:
- break;
- }
- searchState = newState;
- switch (searchState)
- {
- case SearchState.NoTarget:
- Character character0 = PlayersInput.instance[0];
- Character character1 = PlayersInput.instance[1];
- if (character0.beTargetCharacter.Exists(t => t == this))
- {
- character0.beTargetCharacter.Remove(this);
- }
- if (character1.beTargetCharacter.Exists(t => t == this))
- {
- character1.beTargetCharacter.Remove(this);
- }
- targetCharacter = null;
- break;
- case SearchState.InSearchScope:
- break;
- case SearchState.InAttackScope:
- break;
- default:
- break;
- }
- }
- public bool SearchTarget()
- {
- targetCharacter = searchTrigger.GetMinDisTarget(targetTypes, canHitFly);
- if (targetCharacter != null)
- {
- Character character0 = PlayersInput.instance[0];
- Character character1 = PlayersInput.instance[1];
- if (targetCharacter == character0
- && !character0.beTargetCharacter.Exists(t => t == this))
- {
- character0.beTargetCharacter.Add(this);
- }
- if (targetCharacter == character1
- && !character1.beTargetCharacter.Exists(t => t == this))
- {
- character1.beTargetCharacter.Add(this);
- }
- return true;
- }
- else
- {
- return false;
- }
- }
- public void OnSearchState()
- {
- switch (searchState)
- {
- case SearchState.NoTarget:
- if (SearchTarget())
- {
- ChangeSearchState(SearchState.InSearchScope);
- break;
- }
- //向玩家基地移动
- break;
- case SearchState.InSearchScope:
- if (!SearchTarget())
- {
- targetCharacter = null;
- ChangeSearchState(SearchState.NoTarget);
- break;
- }
- if (targetCharacter != null && Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) <= attackDistance)
- {
- ChangeSearchState(SearchState.InAttackScope);
- break;
- }
- break;
- case SearchState.InAttackScope:
- if (targetCharacter != null && !searchTrigger.IsCharacterLeave(targetCharacter, targetTypes, canHitFly))
- {
- if (!targetCharacter.gameObject.activeInHierarchy || targetCharacter.isDie
- || Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) > attackDistance)
- {
- ChangeSearchState(SearchState.NoTarget);
- }
- }
- else
- {
- ChangeSearchState(SearchState.NoTarget);
- }
- break;
- default:
- break;
- }
- }
- public override void Attack1()
- {
- base.Attack1();
- attackTarget = targetCharacter;
- }
- public override void Attack2()
- {
- base.Attack2();
- attackTarget = targetCharacter;
- }
- public void ChosePlayer()
- {
- float distance0 = Mathf.Infinity;
- float distance1 = Mathf.Infinity;
- PlayerController player0 = PlayersInput.instance[0];
- PlayerController player1 = PlayersInput.instance[1];
- if (player0!=null && !player0.isRevive && !player0.isBaseBtnOut)
- {
- distance0 = Mathf.Abs(player0.transform.position.x
- - transform.position.x);
- }
- if (player1!=null && !player1.isRevive && !player1.isBaseBtnOut)
- {
- distance1 = Mathf.Abs(player1.transform.position.x
- - transform.position.x);
- }
- if(distance0 == Mathf.Infinity && distance1 == Mathf.Infinity)
- {
- targetCharacter = null;
- return;
- }
- if (distance0 <= distance1)
- {
- targetCharacter = player0;
- if (!player0.beTargetCharacter.Exists(t => t == this))
- {
- player0.beTargetCharacter.Add(this);
- }
-
- distance = distance0;
- }
- else
- {
- targetCharacter = player1;
- if (!player1.beTargetCharacter.Exists(t => t == this))
- {
- player1.beTargetCharacter.Add(this);
- }
-
- distance = distance1;
- }
- }
- public void ReadyToDash(Vector3 pos0, Vector3 pos1)
- {
- Vector3 target = (pos0 - pos1).normalized;
- float distance = aimDistance;
- aimEffect.transform.localScale =
- new Vector3(distance, 1, 1);
- targetDir = pos0 - pos1;
- float k = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
- if (targetDir.x < 0)
- {
- aimEffect.transform.rotation = Quaternion.Euler(new Vector3(0, 0, k));
- if (bodyTrans.localScale.x < 0)
- {
- bodyTrans.localScale =
- new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
- }
- }
- else
- {
- aimEffect.transform.rotation = Quaternion.Euler(new Vector3(0, 0, k));
- if (bodyTrans.localScale.x > 0)
- {
- bodyTrans.localScale =
- new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
- }
- }
- }
- private void Rush()
- {
- float k = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
- if (targetDir.x < 0)
- {
- dashEffect.offset = 1;
- if (bodyTrans.localScale.x < 0)
- {
- bodyTrans.localScale =
- new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
- }
- bodyTrans.rotation = Quaternion.Euler(new Vector3(0, 0, k - 180));
- }
- else
- {
- if (bodyTrans.localScale.x > 0)
- {
- bodyTrans.localScale =
- new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
- }
- dashEffect.offset = -1;
- bodyTrans.rotation = Quaternion.Euler(new Vector3(0, 0, k));
- }
- rb.velocity = targetDir * rushSpeed;
- }
- }
|