mergemilitary/Assets/Scripts/Game/Wars/Soldiers/SoldierUnit.cs

158 lines
3.8 KiB
C#

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<WarUnit> AttackTarget;
private Rigidbody mBody;
private CapsuleCollider mCollider;
private FSM<SoldierUnit> 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<WarUnit>();
mBody = GetComponent<Rigidbody>();
mCollider = GetComponent<CapsuleCollider>();
mFSM = new FSM<SoldierUnit>(this);
mAvatar = gameObject.AddComponent<AvatarGroup>();
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<PanelGame>().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<WarUnit>();
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<WarUnit>();
if (tUnit != null && Group != tUnit.Group && AttackTarget.Contains(tUnit))
{
AttackTarget.Remove(tUnit);
}
}
}