// unity event handlers void Start() { m_MainCtrl = GameObject.Find("GlobalScript").GetComponent <CCDemo3_MainCtrl>(); m_RefTr = transform.Find("Hips/Spine/Spine1/Spine2/Neck/Neck1"); m_Prop = GetComponent <CCDemo3_EnemyProp>(); Dbg.Assert(m_MainCtrl != null, "CCDemo3_EnemyMarker.Start: failed to get mainctrl"); Dbg.Assert(m_RefTr != null, "CCDemo3_EnemyMarker.Start: failed to get spine transform"); Dbg.Assert(m_Prop != null, "CCDemo3_EnemyMarker.Start: failed to get prop"); }
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); }
/// <summary> /// he who dares to touch the wall will be dead /// </summary> public void OnTouchWall(GameObject chara) { GameObject owner = _GetCollisionOwner(chara); Animator anim = owner.GetComponent <Animator>(); anim.SetTrigger(LIGHT_PUNCH_HASH); if (owner == m_PlayerGO) { m_HP = 0; _OnPlayerDie(); } else { CCDemo3_EnemyProp prop = owner.GetComponent <CCDemo3_EnemyProp>(); prop.HP = 0; _OnEnemyDie(owner); } }
private void _OnParryCCStop(CutsceneController cc) { cc.OnPlayStopped -= _OnParryCCStop; var swaplst = CutsceneController.GetSwapObjList(cc); foreach (var pr in swaplst) { if (pr.m_ExternalGO.name == "Enemy") { // apply root motion GameObject atkGO = pr.m_ExternalGO; Transform tr = atkGO.transform; Transform hips = tr.Find("Hips"); Vector3 pos = hips.position; pos.y = tr.position.y; tr.position = pos; pos = hips.localPosition; pos.x = pos.z = 0f; hips.localPosition = pos; Vector3 angles = hips.eulerAngles; angles.x = angles.z = 0; tr.eulerAngles = angles; // jump to LIEDOWN_STATE Animator anim = tr.GetComponent <Animator>(); anim.Play(LIEDOWN_STATE); // apply dmg CCDemo3_EnemyProp prop = atkGO.GetComponent <CCDemo3_EnemyProp>(); prop.HP -= prop.AtkPwr; if (prop.HP <= 0) { _OnEnemyDie(prop.gameObject); } } else if (pr.m_ExternalGO.name == "Player") { EnableParry = false; // apply root motion Transform tr = m_PlayerGO.transform; Transform hips = tr.Find("Hips"); Vector3 pos = hips.position; pos.y = tr.position.y; tr.position = pos; Dbg.Log("enemy pos: {0}", pos); pos = hips.localPosition; pos.x = pos.z = 0f; hips.localPosition = pos; Vector3 angles = hips.eulerAngles; angles.x = angles.z = 0; tr.eulerAngles = angles; // jump to idle state m_PlayerAnimator.Play(IDLE_STATE, 0, 0); } } }
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); } } }
// "Coroutine" private Job Job_SpawnEnemyWave(float delay) { yield return(new WaitForSeconds(delay)); m_CurrentWave++; Vector3 pos = m_MainCtrl.GetPlayerGO().transform.position; if (m_CurrentWave != m_TotalWaves) //for mobs { int enemyCategoryCnt = m_EnemyDescLst.Count; for (int i = 0; i < m_CurrentWave; ++i) { int enemyTypeIdx = Random.Range(0, enemyCategoryCnt); EnemyDesc desc = m_EnemyDescLst[enemyTypeIdx]; float radian = Random.Range(0f, 2 * Mathf.PI); float x = pos.x + Mathf.Cos(radian) * m_SpawnDist; float z = pos.z + Mathf.Sin(radian) * m_SpawnDist; float y = pos.y; Vector3 enemyPos = new Vector3(x, y, z); //Dbg.Log("radian : {0}, pos {1}", radian, enemyPos); Quaternion enemyFacing = Quaternion.LookRotation(pos - enemyPos); GameObject enemy = GameObject.Instantiate(desc.m_Prefab, enemyPos, enemyFacing) as GameObject; CCDemo3_EnemyProp prop = enemy.GetComponent <CCDemo3_EnemyProp>(); prop.HP = desc.m_HP; prop.AtkPwr = desc.m_Atk; prop.m_AnimatorSpeed = desc.m_AnimatorSpeed; m_ActiveEnemies.Add(enemy.transform); m_MainCtrl.OnEnemySpawn(enemy); } } else //for boss { float radian = Random.Range(0f, 2 * Mathf.PI); float x = pos.x + Mathf.Cos(radian) * m_SpawnDist; float z = pos.z + Mathf.Sin(radian) * m_SpawnDist; float y = pos.y; Vector3 enemyPos = new Vector3(x, y, z); Quaternion enemyFacing = Quaternion.LookRotation(pos - enemyPos); EnemyDesc desc = m_BossDesc; GameObject enemy = GameObject.Instantiate(desc.m_Prefab, enemyPos, enemyFacing) as GameObject; CCDemo3_EnemyProp prop = enemy.GetComponent <CCDemo3_EnemyProp>(); prop.HP = desc.m_HP; prop.AtkPwr = desc.m_Atk; prop.m_AnimatorSpeed = desc.m_AnimatorSpeed; var marker = enemy.GetComponent <CCDemo3_EnemyMarker>(); marker.enabled = true; m_ActiveEnemies.Add(enemy.transform); m_MainCtrl.OnEnemySpawn(enemy); } m_bHinted = false; }
// private method /// <summary> /// decide to walk or atk /// when called, it is guaranteed to be in valid state /// </summary> private void _ThinkActions(Transform enemy) { Transform playerTr = m_MainCtrl.GetPlayerGO().transform; float dist = (playerTr.position - enemy.position).magnitude; Animator anim = enemy.GetComponent <Animator>(); CCDemo3_EnemyProp prop = enemy.GetComponent <CCDemo3_EnemyProp>(); prop.TimeUntilNextThink = Random.Range(0.2f, 0.5f); float r = Random.value; //reset the values anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, 0f); anim.SetFloat(CCDemo3_MainCtrl.STRAFE_SPD_HASH, 0f); if (m_TimeSinceLastAtk > m_AtkInterval && dist < 2 * HEAVY_PUNCH_DIST) { //atk if (r > 0.5f) { //Dbg.Log("Atk"); anim.SetTrigger(CCDemo3_MainCtrl.HEAVY_PUNCH_HASH); m_TimeSinceLastAtk = 0f; } } else { //move if (dist < NEAR_THRES) { //Dbg.Log("Force backward"); anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, -1.0f); } else if (dist > FAR_THRES) { //Dbg.Log("Force forward"); anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, 1.0f); } else { if (r <= 0.25f) { //left //Dbg.Log("left"); anim.SetFloat(CCDemo3_MainCtrl.STRAFE_SPD_HASH, -1f); } else if (r <= 0.5f) { //right //Dbg.Log("right"); anim.SetFloat(CCDemo3_MainCtrl.STRAFE_SPD_HASH, 1f); } else if (r <= 0.75f) { //forward //Dbg.Log("foward"); anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, 1f); } else if (r <= 1f) { //backward //Dbg.Log("backward"); anim.SetFloat(CCDemo3_MainCtrl.FORWARD_SPD_HASH, -1f); } } } }