using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class SoldierUnit : WarUnit { public bool HasAttackableTarget => AttackTarget.Count > 0 && AttackTarget[0] != null; [Header("State")] public string CurrentState; [Header("Targets")] public WarUnit MoveTarget; public WarUnit ShootTarget; public List AttackTarget; private Rigidbody mBody; private CapsuleCollider mCollider; private FSM mFSM; private AvatarGroup mAvatar; private bool mActive = false; private Vector3 mMovePos = Vector3.zero; [SerializeField]private Vector3 mVelocity = Vector3.zero; private HudHp mHpBar; protected override void AwakeInit() { AttackTarget = new List(); mBody = GetComponent(); mCollider = GetComponent(); mFSM = new FSM(this); mAvatar = gameObject.AddComponent(); Freeze(); } private void FixedUpdate() { if (!mActive) return; if (mFSM != null) { mFSM.Execute(Time.fixedDeltaTime); CurrentState = mFSM.CurrentState; } if (mBody != null) { mBody.velocity = mVelocity; mVelocity = Vector3.zero; } } public void Active() { mActive = true; mBody.isKinematic = false; mCollider.enabled = true; mFSM.ChangeState(typeof(SoldierStateRun)); mHpBar = UIManager.Instance.GetUI().CreateHudHp(mTrans, Utils.GetHpHOffset(BType, Level), Group == GroupType.Enemy, Utils.GetHpScale(BType, Level)); mHpBar.gameObject.SetActive(false); } public void Freeze() { mActive = false; mBody.isKinematic = true; mCollider.enabled = false; } public void Win() { mFSM.ChangeState(typeof(SoldierStateWin)); } public void SetACTrigger(SoldierACTrigger pTrigger, float pSpeed = 1) { mAvatar.SetACTrigger(pTrigger, pSpeed); } public void LookToTarget(Vector3 pTargetPos) { pTargetPos.y = mTrans.position.y; mTrans.LookAt(pTargetPos); } public void MoveToTarget(float pDeltaTime) { if (MoveTarget == null || MoveTarget.IsDead) return; Vector3 tMyPos = RelativePos(); mMovePos = MoveTarget.RelativePos(tMyPos); MoveToPos(pDeltaTime); } public void MoveToPos(float pDeltaTime) { Vector3 tMyPos = RelativePos(); LookToTarget(mMovePos); Vector3 tDir = mMovePos - tMyPos; tDir.y = 0; mVelocity = tDir.normalized * MoveSpeed * pDeltaTime; } public void StopMoving() { mVelocity = Vector3.zero; } protected override void HandleHurt(int pDamage) { mHpBar.gameObject.SetActive(true); mHpBar.RefreshHp((float)mCurHp / MaxHP); VibrateManager.Instance.Vibrate(VibrateType.Light); } protected override void HandleDie() { Freeze(); mFSM.ChangeState(typeof(SoldierStateDead)); mHpBar.gameObject.SetActive(false); Utils.DelayHideGameObject(gameObject, 3); } private void OnCollisionEnter(Collision pCollision) { GameObject tHitOb = pCollision.gameObject; WarUnit tUnit = tHitOb.GetComponent(); if (tUnit != null && Group != tUnit.Group && !AttackTarget.Contains(tUnit)) { AttackTarget.Add(tUnit); } } private void OnCollisionExit(Collision pCollision) { GameObject tHitOb = pCollision.gameObject; WarUnit tUnit = tHitOb.GetComponent(); if (tUnit != null && Group != tUnit.Group && AttackTarget.Contains(tUnit)) { AttackTarget.Remove(tUnit); } } }