You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Plugins/Animancer/Examples/06 State Machines/05 Weapons/EquipState.cs

145 lines
5.0 KiB
C#

3 months ago
// Animancer // Copyright 2020 Kybernetik //
#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value.
using Animancer.Examples.StateMachines.Brains;
using System;
using UnityEngine;
namespace Animancer.Examples.StateMachines.Weapons
{
/// <summary>
/// A <see cref="CreatureState"/> which managed the currently equipped <see cref="Weapon"/>.
/// </summary>
[AddComponentMenu(Strings.MenuPrefix + "Examples/Weapons - Equip State")]
[HelpURL(Strings.APIDocumentationURL + ".Examples.StateMachines.Weapon/EquipState")]
public sealed class EquipState : CreatureState
{
/************************************************************************************************************************/
[SerializeField] private Transform _WeaponHolder;
[SerializeField] private Weapon _Weapon;
private Weapon _EquippingWeapon;
private Action _OnUnequipEnd;
/************************************************************************************************************************/
// Called by UI Buttons.
public Weapon Weapon
{
get { return _Weapon; }
set
{
if (enabled)
return;
_EquippingWeapon = value;
if (!Creature.StateMachine.TrySetState(this))
_EquippingWeapon = _Weapon;
}
}
/************************************************************************************************************************/
private void Awake()
{
_EquippingWeapon = _Weapon;
_OnUnequipEnd = OnUnequipEnd;
AttachWeapon();
}
/************************************************************************************************************************/
public override bool CanEnterState(CreatureState previousState)
{
// This state can only be entered by setting the Weapon property.
return _Weapon != _EquippingWeapon;
}
/************************************************************************************************************************/
/// <summary>
/// Start at the beginning of the sequence by default, but if the previous attack hasn't faded out yet then
/// perform the next attack instead.
/// </summary>
private void OnEnable()
{
if (_Weapon.UnequipAnimation.Clip != null)
{
var state = Creature.Animancer.Play(_Weapon.UnequipAnimation);
state.Events.OnEnd = _OnUnequipEnd;
}
else
{
OnUnequipEnd();
}
}
/************************************************************************************************************************/
private void OnUnequipEnd()
{
DetachWeapon();
_Weapon = _EquippingWeapon;
AttachWeapon();
if (_Weapon.EquipAnimation.Clip != null)
{
var state = Creature.Animancer.Play(_Weapon.EquipAnimation);
state.Events.OnEnd = Creature.ForceEnterIdleState;
}
else
{
Creature.StateMachine.ForceSetState(Creature.Idle);
}
}
/************************************************************************************************************************/
private void AttachWeapon()
{
if (_Weapon == null)
return;
if (_WeaponHolder != null)
{
var transform = _Weapon.transform;
transform.parent = _WeaponHolder;
transform.localPosition = Vector3.zero;
transform.localRotation = Quaternion.identity;
transform.localScale = Vector3.one;
}
_Weapon.gameObject.SetActive(true);
}
private void DetachWeapon()
{
if (_Weapon == null)
return;
// It might be more appropriate to reparent inactive weapons to the inventory system if you have one.
// Or you could even attach them to specific bones on the character and leave them active.
_Weapon.transform.parent = transform;
_Weapon.gameObject.SetActive(false);
}
/************************************************************************************************************************/
private void FixedUpdate()
{
Creature.Rigidbody.velocity = Vector3.zero;
}
/************************************************************************************************************************/
public override bool CanExitState(CreatureState nextState)
{
return false;
}
/************************************************************************************************************************/
}
}