private void _DoWalking(Transform enemy) { Transform playerTr = m_MainCtrl.GetPlayerGO().transform; CCDemo3_EnemyProp prop = enemy.GetComponent <CCDemo3_EnemyProp>(); prop.TimeUntilNextThink -= Time.deltaTime; if (prop.TimeUntilNextThink < 0 || (playerTr.position - enemy.position).magnitude < NEAR_THRES) { _ThinkActions(enemy); return; } Animator anim = enemy.GetComponent <Animator>(); int st = 0; // get the state if (anim.IsInTransition(0)) { AnimatorStateInfo s = anim.GetNextAnimatorStateInfo(0); st = CCDemo3_Helper.GetAnimatorStateHash(s); } else { AnimatorStateInfo s = anim.GetCurrentAnimatorStateInfo(0); st = CCDemo3_Helper.GetAnimatorStateHash(s); } //execute move if (st == CCDemo3_MainCtrl.FORWARD_STATE) { anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, 1.0f); } else if (st == CCDemo3_MainCtrl.BACKWARD_STATE) { anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, -1.0f); } else if (st == CCDemo3_MainCtrl.STRAFE_LEFT_STATE || st == CCDemo3_MainCtrl.STRAFE_RIGHT_STATE) { float strafe = (st == CCDemo3_MainCtrl.STRAFE_LEFT_STATE) ? -1f : 1f; anim.SetFloat(CCDemo3_MainCtrl.STRAFE_SPD_HASH, strafe); float dist = (playerTr.position - enemy.position).magnitude; //the radius float deltaAngle = prop.RotateSpeed * Time.deltaTime / dist * Mathf.Rad2Deg * -strafe; Quaternion q = Quaternion.Euler(0, deltaAngle, 0); Vector3 diff = enemy.position - playerTr.position; Vector3 newDiff = q * diff; enemy.position = newDiff + playerTr.position; } _FaceEnemyToPlayer(enemy, playerTr); }
public bool IsAtking(GameObject go) { Animator animator = go.GetComponent <Animator>(); int st = 0; if (animator.IsInTransition(0)) { st = CCDemo3_Helper.GetAnimatorStateHash(animator.GetNextAnimatorStateInfo(0)); } else { st = CCDemo3_Helper.GetAnimatorStateHash(animator.GetCurrentAnimatorStateInfo(0)); } return(st == HEAVY_PUNCH_STATE || st == LIGHT_PUNCH_STATE); }
void Update() { int curState = CCDemo3_Helper.GetAnimatorStateHash(m_Animator.GetCurrentAnimatorStateInfo(0)); AnimatorStateInfo nextStateInfo = m_Animator.GetNextAnimatorStateInfo(0); int nextState = CCDemo3_Helper.GetAnimatorStateHash(nextStateInfo); if (curState != CCDemo3_MainCtrl.LIGHT_PUNCH_STATE && (nextState != CCDemo3_MainCtrl.LIGHT_PUNCH_STATE)) { //if( m_LightPunchCollider.enabled ) //{ // //Dbg.Log("disable LP {0}", Time.frameCount); //} m_LightPunchCollider.enabled = false; } if (curState != CCDemo3_MainCtrl.HEAVY_PUNCH_STATE && (nextState != CCDemo3_MainCtrl.HEAVY_PUNCH_STATE)) { m_HeavyPunchCollider.enabled = false; } }
public bool IsCanWalkState(GameObject go) { Animator animator = go.GetComponent <Animator>(); int st = 0; if (animator.IsInTransition(0)) { st = CCDemo3_Helper.GetAnimatorStateHash(animator.GetNextAnimatorStateInfo(0)); } else { st = CCDemo3_Helper.GetAnimatorStateHash(animator.GetCurrentAnimatorStateInfo(0)); } if (st == IDLE_STATE) { return(true); } else { return(IsWalkingState(go)); } }
public void OnHit(GameObject hit, GameObject beHit) { GameObject atkGO = _GetCollisionOwner(hit); GameObject defGO = _GetCollisionOwner(beHit); if (defGO == m_PlayerGO) //player gets hit by enemy { if (atkGO == m_PlayerGO) { //this is possible if the action make his own hand touches his own body... return; } if (!IsAtking(atkGO)) { //the accident collision should not be counted return; } if (IsUnderAtk(defGO)) { return; //if already be hit, don't add new } if (EnableParry) { if (!m_ParryCC.gameObject.activeSelf) { Transform cctr = m_ParryCC.transform; Transform playerTr = m_PlayerGO.transform; m_ParryCC.gameObject.SetActive(true); var swaplst = CutsceneController.GetSwapObjList(m_ParryCC); swaplst.Add(new CutsceneController.SwapObjPair(defGO, cctr.Find("Player").gameObject)); swaplst.Add(new CutsceneController.SwapObjPair(atkGO, cctr.Find("Enemy").gameObject)); Vector3 ccPos = playerTr.position; ccPos.y = cctr.position.y; cctr.position = ccPos; Vector3 fdir = atkGO.transform.position - playerTr.position; fdir.y = 0; cctr.forward = fdir; CutsceneController.StartCC(m_ParryCC); m_ParryCC.OnPlayStopped += _OnParryCCStop; } } else { CCDemo3_EnemyProp prop = atkGO.GetComponent <CCDemo3_EnemyProp>(); Transform playerTr = m_PlayerGO.transform; Vector3 atkPos = atkGO.transform.position; atkPos.y = playerTr.position.y; playerTr.forward = atkPos - playerTr.position; m_HP = Mathf.Clamp(m_HP - prop.AtkPwr, 0, int.MaxValue); Dbg.Log("player under atk, hp = {0}", m_HP); if (m_HP <= 0) { m_PlayerAnimator.SetTrigger(HEAVY_PUNCHED_HASH); _OnPlayerDie(); } else { m_PlayerAnimator.SetTrigger(HEAVY_PUNCHED_HASH); } } } else //player hit the enemy { if (atkGO != m_PlayerGO) { //two enemies collide... return; } if (!IsAtking(atkGO)) { return; } if (IsUnderAtk(defGO)) { return; //if already be hit, don't add new } int atkStateHash = CCDemo3_Helper.GetAnimatorStateHash(m_PlayerAnimator.GetCurrentAnimatorStateInfo(0)); Transform defTr = defGO.transform; CCDemo3_EnemyProp prop = defGO.GetComponent <CCDemo3_EnemyProp>(); Animator enemyAnimator = defTr.GetComponent <Animator>(); if (atkStateHash == LIGHT_PUNCH_STATE) { Vector3 dir = atkGO.transform.position - defTr.position; dir.y = 0; defTr.forward = dir; prop.HP -= m_LightPunchPwr; enemyAnimator.SetTrigger(LIGHT_PUNCHED_HASH); Dbg.Log("Enemy {0} under atk, hp = {1}", defGO.name, prop.HP); } else if (atkStateHash == HEAVY_PUNCH_STATE) { Vector3 dir = atkGO.transform.position - defTr.position; dir.y = 0; defTr.forward = dir; prop.HP -= m_HeavyPunchPwr; enemyAnimator.SetTrigger(HEAVY_PUNCHED_HASH); Dbg.Log("Enemy {0} under atk, hp = {1}", defGO.name, prop.HP); } if (prop.HP <= 0) { _OnEnemyDie(prop.gameObject); } } }