Files
Scove 3e39117acc Consolidate third-party plugins into Assets/Plugins
Move and consolidate many third-party plugin files and metadata from various locations (notably Assets/Third Parties/Plugins 1 and scattered Opsive/Photon folders) into a unified Assets/Plugins directory. Includes DOTween, PrimeTween, Native/BackroomsNoise, Sirenix/Odin Inspector, and Opsive UltimateCharacterController/shared libs, plus updates to several .meta files and removal of obsolete installer/legacy files. This standardizes plugin layout and cleans up duplicate/obsolete assets.
2026-06-16 18:41:44 +07:00

119 lines
4.3 KiB
C#

/// ---------------------------------------------
/// Ultimate Character Controller
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.UltimateCharacterController.Character.Abilities
{
using Opsive.Shared.Events;
using Opsive.Shared.Utility;
using UnityEngine;
/// <summary>
/// Plays a death animation when the character dies.
/// </summary>
[DefaultStartType(AbilityStartType.Manual)]
[DefaultState("Death")]
[DefaultAbilityIndex(4)]
public class Die : Ability
{
[Tooltip("The amount of force to add to the camera. This value will be multiplied by the death force magnitude.")]
[SerializeField] protected Vector3 m_CameraRotationalForce = new Vector3(0, 0, 0.75f);
public Vector3 CameraRotationalForce { get { return m_CameraRotationalForce; } set { m_CameraRotationalForce = value; } }
/// <summary>
/// The type of animation that the ability should play.
/// </summary>
private enum DeathType {
Forward, // Play a forward death animation.
Backward // Play a backward death animation.
}
private int m_DeathTypeIndex;
private Vector3 m_Force;
private Vector3 m_Position;
[NonSerialized] public Vector3 Force { get { return m_Force; } set { m_Force = value; } }
[NonSerialized] public Vector3 Position { get { return m_Position; } set { m_Position = value; } }
public override int AbilityIntData { get { return m_DeathTypeIndex; } }
public override bool CanStayActivatedOnDeath { get { return true; } }
/// <summary>
/// Initialize the default values.
/// </summary>
public override void Awake()
{
base.Awake();
EventHandler.RegisterEvent<Vector3, Vector3, GameObject>(m_GameObject, "OnDeath", OnDeath);
EventHandler.RegisterEvent(m_GameObject, "OnRespawn", OnRespawn);
}
/// <summary>
/// The character has died. Start the ability.
/// </summary>
/// <param name="position">The position of the force.</param>
/// <param name="force">The amount of force which killed the character.</param>
/// <param name="attacker">The GameObject that killed the character.</param>
private void OnDeath(Vector3 position, Vector3 force, GameObject attacker)
{
if (!Enabled) {
return;
}
m_Force = force;
m_Position = position;
m_DeathTypeIndex = GetDeathTypeIndex(position, force, attacker);
StartAbility();
}
/// <summary>
/// Returns the value that the AbilityIntData parameter should be set to.
/// </summary>
/// <param name="position">The position of the force.</param>
/// <param name="force">The amount of force which killed the character.</param>
/// <param name="attacker">The GameObject that killed the character.</param>
/// <returns>The value that the AbilityIntData parameter should be set to.</returns>
protected virtual int GetDeathTypeIndex(Vector3 position, Vector3 force, GameObject attacker)
{
return (int)(m_Transform.InverseTransformPoint(position).z > 0 ? DeathType.Forward : DeathType.Backward);
}
/// <summary>
/// The ability has started.
/// </summary>
protected override void AbilityStarted()
{
base.AbilityStarted();
m_CharacterLocomotion.ResetRotationPosition();
EventHandler.ExecuteEvent(m_GameObject, "OnCameraRotationalForce", m_CameraRotationalForce * m_Force.magnitude);
}
/// <summary>
/// The character has respawned. Stop the die ability.
/// </summary>
private void OnRespawn()
{
if (!Enabled) {
return;
}
StopAbility();
}
/// <summary>
/// Called when the character is destroyed.
/// </summary>
public override void OnDestroy()
{
base.OnDestroy();
EventHandler.UnregisterEvent<Vector3, Vector3, GameObject>(m_GameObject, "OnDeath", OnDeath);
EventHandler.UnregisterEvent(m_GameObject, "OnRespawn", OnRespawn);
}
}
}