예제 #1
0
	IEnumerator Die(Transform attacker, CharacterAttacking charAttacking, Vector3 hitDir)
	{
		if(!IsEnemy)
			InputChange (false);
		_charMotor.GrabbedSetup(false);
		if(voiceDie)
		{
			if (deadPrefab == null)
				Manager_Audio.PlaySound(_myAudio, voiceDie, false);
			else AudioSource.PlayClipAtPoint(voiceDie, myTransform.position);
		}
		// Stop displaying our target cursor.
		Manager_Targeting.instance.DisableTargetCursors (PlayerNumber, _charAttacking);
		if (myDizzyParticle && _dizPartEmit && _dizPartEmit.emit)
		{
			_dizPartEmit.emit = false;
			Stunned = false;
			_stunAmount = 0;
		}
		gameObject.name += "Dead"; // Now Detection radius' won't find us.
		if(IsEnemy)
		{
			// This enemy is no longer a target.
			if(Manager_Targeting.instance.enemyTargets.Contains(this.transform))
				Manager_Targeting.instance.enemyTargets.Remove(this.transform);
		}
		if(attacker != null)
		{
			// Setup for resetting attacker's combo and changing target for
			// anyone who has this character targeted since they are dead,
			// they shouldn't be targeted anymore.
			if(charAttacking == null)
				charAttacking = attacker.GetComponent<CharacterAttacking>();
			if(charAttacking.StartedComboEnemy == myTransform)
				charAttacking.ComboChange(false);
			if(IsEnemy)
			{
				if(charAttacking.TargetedCharacter == myTransform)
					charAttacking.TargetChange();
				if(Manager_Targeting.instance.playerTargets.Count > 1)
				{
					foreach(Transform player in Manager_Targeting.instance.playerTargets)
					{
						if(player != attacker)
						{
							CharacterAttacking pAttacking = player.GetComponent<CharacterAttacking>();
							if(pAttacking.StartedComboEnemy == myTransform)
								pAttacking.ComboChange(false);
							if(pAttacking.TargetedCharacter == myTransform)
								pAttacking.TargetChange();
						}
					}
				}
			}
		}
		// Additional height added from dying.
		hitDir.y = 3 + (hitDir.y * 2);
		if(IsEnemy)
		{
			// Get rid of our health bar and NavMeshAgent.
			Destroy (healthSlider.transform.parent.gameObject);
			Destroy (_characterAI.Agent.gameObject, 0.1f);
			_characterAI.enabled = false;
			// We are no longer needed in this list.
			Manager_Game.instance.enemiesAll.Remove(this.gameObject);
		}
		Transform myCamTarget = myTransform;
		if(deadPrefab != null) // A ragdoll is assigned.
		{
			// Create our ragdoll and give it velocity based on our hitDir.
			GameObject ragdoll = Instantiate(deadPrefab, myTransform.position, myTransform.rotation) as GameObject;
			Rigidbody ragRigid = ragdoll.GetComponentInChildren<Rigidbody>();
			ragRigid.velocity = new Vector3(hitDir.x * 3, hitDir.y, hitDir.z * 3);
			if(IsEnemy)
			{
				// Our ragdoll is the dead enemy for us now.
				Manager_Game.instance.enemiesDead.Add(ragdoll);
				Destroy(this.gameObject);
				StopCoroutine("GotHit");
				yield break;
			}
			else
			{
				// Make the cam switch its current target of this character with
				// the ragdoll. Use the one with the rigidbody on it.
				Camera_BEU.instance.ChangeTarget(myTransform, ragRigid.transform);
				myCamTarget = ragRigid.transform;
				// Make it so we can't be seen.
				foreach(SkinnedMeshRenderer skinMesh in mySkinnedMeshes)
					skinMesh.enabled = false;
				// We disable ourselves while the ragdoll is there.
				myRigidbody.isKinematic = true;
				GetComponent<Collider>().enabled = false;
				yield return new WaitForSeconds(4);
				if(playerLives > 1) // We can respawn.
				{
					// Change the cam back to us in place of our ragdoll.
					Camera_BEU.instance.ChangeTarget(ragRigid.transform, myTransform);
					Destroy (ragdoll); // No longer need the ragdoll.
				}
			}
		}
		else // Die using an animation.
		{
			if(IsEnemy && !Manager_Game.instance.enemiesDead.Contains(this.gameObject))
				Manager_Game.instance.enemiesDead.Add(this.gameObject);
		}
		if(IsEnemy)
			_charAttacking.enabled = false;
		else
		{
			if(playerLives > 1)
			{
				if(deadPrefab == null) // Died using an animation.
				{
					yield return new WaitForSeconds(2.9f); // Dead time
					foreach(SkinnedMeshRenderer skinnedMesh in mySkinnedMeshes)
						skinnedMesh.enabled = false;
					yield return new WaitForSeconds(0.1f);
				}
				Respawn();
				yield return new WaitForSeconds(1.5f);
			}
			else // No more lives left.
			{
                Manager_Game.instance.LiveChange(PlayerNumber, -1);
				// We are no longer an active player in the game...
				if(Manager_Targeting.instance.playerTargets.Contains(this.transform))
					Manager_Targeting.instance.playerTargets.Remove(this.transform);
                Manager_Game.instance.allPlayerStatus.Remove(this);
				if(!Manager_Game.playersDefeated.Contains(this.gameObject))
					Manager_Game.playersDefeated.Add(this.gameObject);
				// The Manager_UI will now not display our results at the end of
				// the stage, provided that another player makes it.
				if(PlayerNumber == 1)
					Manager_UI.ShowP1Results = false;
				else if(PlayerNumber == 2)
					Manager_UI.ShowP2Results = false;
                else if(PlayerNumber == 3)
                    Manager_UI.ShowP3Results = false;
                else if(PlayerNumber == 4)
                    Manager_UI.ShowP4Results = false;
				// The camera doesn't need to target us anymore.
				Camera_BEU.instance.targets.Remove(this.transform);
				if(Manager_Game.playersDefeated.Count == Manager_Game.NumberOfPlayers)
				{
					// Game Over!
					Manager_Game.instance.Invoke("GameOver", 1);
				}
				else // Other players remain.
				{
					// Wait until the battle ends.
					while(Manager_BattleZone.instance.InBattle)
						yield return 0;
					Camera_BEU.instance.RemoveTarget(myCamTarget);
					// Next is where we control an AI player who may still
					// be active in the game using our controls while keeping
					// their player number.
					foreach(Transform player in Manager_Targeting.instance.playerTargets)
					{
						if(player)
						{
							CharacterStatus cStatus = player.GetComponent<CharacterStatus>();
							if(cStatus.AIOn)
							{
                                if(player == Manager_Targeting.instance.playerTargets[0])
								    cStatus.InputChange(true, true, PlayerNumber);
                                cStatus.SendMessage("FindLeadPlayer");
							}
						}
					}
					// We will flash away and then be deactivated if we do not have a ragdoll
					if(!deadPrefab)
						StartFlash(0.2f, 0.6f, 3, FlashType.Renderer_Disable);
				}
			}
		}
		StopCoroutine ("Die");
	}