158 lines
3.8 KiB
C#
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);
|
|
}
|
|
}
|
|
} |