- Home /
Weapon System and Animation Events
I have started setting up a weapon system for a multiplayer fps.
I am trying to use single responsibility and stay away from manager classes.
So, I have created the following interfaces
public interface ISwingable
{
void Swing();
}
public interface IShootable
{
void Shoot();
}
The weapons will drive the player animation. For example, an Axe or Sword would drive a swing animation. And a AK47 or pistol would drive a shoot animation.
I created an AttackAnimation class that is attached to the player and drives their animation.
// TODO: do we want this on the player or weapon??
public class AttackAnimation : MonoBehaviour
{
Animator anim;
bool isMounted = false;
void Awake()
{
anim = GetComponent<Animator>();
}
void Start()
{
// activate the attack animation layer
anim.SetLayerWeight(1, 1f);
}
void Update()
{
anim.SetInteger("CurrentAction", 0);
if (Input.GetButton("Fire1"))
{
anim.SetInteger("CurrentAction", 1);
}
}
}
I then implemented my ISwingable and IShootable interfaces.
public class MeleeAttack : MonoBehaviour, ISwingable
{
public Transform collisionPoint;
public void Swing()
{
Collider[] hits = Physics.OverlapSphere(collisionPoint.position, .5f);
foreach (Collider hit in hits)
{
if (hit.transform.root != transform) // can use this or layers to stop from hitting yourself
{
//Debug.Log(hit.name);
ActivateHittables.HitAll(hit.gameObject);
}
}
}
}
public class RangedAttack : MonoBehaviour, IShootable
{
public float range = 500f;
void Update()
{
if (Input.GetButton("Fire1"))
{
Shoot();
}
}
public void Shoot()
{
RaycastHit hit;
if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit, range))
{
ActivateHittables.HitAll(hit.collider.gameObject);
}
}
}
I was going to have MeleeAttack::Swing() called by an Animation Event on the player's swing animation.
What is the best way to organize these scripts?
Would it be better to have MeleeAttack and RangedAttack attached to the Player or the Weapon's game object?
If they are attached to the weapon I'm not sure how to call MeleeAttack::Swing() via an animation event.
Could anyone help me organize this a bit? I'm trying to setup a weapon system that conforms to single responsibility.
Thank you
Your answer
Follow this Question
Related Questions
Mecanim animation layers and animation events 3 Answers
3rd person gta like weapon problem?? 0 Answers
Mecanim attack State won't stop Looping or exit 1 Answer
Mecanim animation events 2 Answers