using UnityEngine; using UnityEngine.AI; using UnityEngine.Animations; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public abstract class HumanAi : BaseAi { #region Properties and variables // 일반 변수 protected LayerMask targetLayer; protected Vector3 defensePos; // 모델링 관련 변수 protected Transform backpackContainer; protected Transform leftWeaponContainer; protected Transform leftShieldContainer; protected Transform headContainer; protected Transform rightWeaponContainer; protected Transform bodyContainer; protected Transform flagContainer; // 컴포넌트 관련 변수 protected Animator humanAnimator; protected NavMeshAgent humanAgent; protected CapsuleCollider myCollider; protected CapsuleCollider hitBoxCollider; protected LookAtConstraint lookAtConstraint; // 애니메이션 관련 변수 protected static readonly int SpeedHash = Animator.StringToHash("Speed"); protected static readonly int AttackHash = Animator.StringToHash("Attack"); protected static readonly int DamageHash = Animator.StringToHash("TakeDamage"); protected static readonly int DeathTypeHash = Animator.StringToHash("DeathType"); protected static readonly int DeathHash = Animator.StringToHash("Death"); protected static readonly int ShieldHash = Animator.StringToHash("Shield"); protected static readonly int OutlineColorHash = Shader.PropertyToID("_OutlineColor"); #endregion #region Abstract methods protected abstract void SetLayer(); protected abstract void SetCurrentHp(float value); #endregion #region Unity built-in methods protected virtual void Awake() { InitComponent(); FlagLookAtFlag(); SetLayer(); } #endregion #region Custom methods private void InitComponent() { backpackContainer = Utils.GetComponentAndAssert(transform. Find("Bip001/Bip001 Pelvis/Bip001 Spine/Backpack_container")); leftWeaponContainer = Utils.GetComponentAndAssert(transform. Find("Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 L Clavicle/Bip001 L UpperArm/Bip001 L Forearm/Bip001 L Hand/L_hand_container")); leftShieldContainer = Utils.GetComponentAndAssert(transform. Find("Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 L Clavicle/Bip001 L UpperArm/Bip001 L Forearm/Bip001 L Hand/L_shield_container")); headContainer = Utils.GetComponentAndAssert(transform. Find("Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 Neck/Bip001 Head/Head_container")); rightWeaponContainer = Utils.GetComponentAndAssert(transform. Find("Bip001/Bip001 Pelvis/Bip001 Spine/Bip001 R Clavicle/Bip001 R UpperArm/Bip001 R Forearm/Bip001 R Hand/R_hand_container")); bodyContainer = Utils.GetComponentAndAssert(transform. Find("Body_container")); flagContainer = Utils.GetComponentAndAssert(transform. Find("Flag_container")); humanAnimator = Utils.GetComponentAndAssert(transform); humanAgent = Utils.GetComponentAndAssert(transform); myCollider = Utils.GetComponentAndAssert(transform); hitBoxCollider = Utils.GetComponentAndAssert(transform.Find("HitBox")); lookAtConstraint = Utils.GetComponentAndAssert(flagContainer); } private void FlagLookAtFlag() { if (Camera.main != null) { var source = new ConstraintSource { sourceTransform = Camera.main.transform, weight = 1f }; lookAtConstraint.AddSource(source); } lookAtConstraint.constraintActive = true; } protected void SetActiveViewModel(Transform container, int model) { foreach (Transform item in container) { if (!item.gameObject.activeSelf) continue; item.gameObject.SetActive(false); } if (model != -1) { container.GetChild(model).gameObject.SetActive(true); } } protected void SetMoveSpeed(float value) => humanAgent.speed = value; #endregion } }