- Home /
How to build a humanoid class with body parts that can be accessed?
I have the following code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Humanoid : MonoBehaviour
{
public string thisThingName;
public enum bodyParts { arm = 1, torso = 2, legs = 3 };
public Humanoid(string name)
{
thisThingName = name;
}
}
And my problem is that I want to access the bodyParts variable as a part of any new human I create. I.E. I want to be able to do something like this:
public Humanoid newHuman = new Humanoid("Doug");
public void Start()
{
if(Input.GetMouseButtonDown(0))
{
newHuman.bodyParts.Torso = Humanoid.damageTypes.Gravely_Injured;
}
}
But I can only reference it in this form:
public Humanoid newHuman = new Humanoid("Doug");
public void Start()
{
if(Input.GetMouseButtonDown(0))
{
Humanoid.bodyParts.arm;
}
}
Notice how the body parts enum is completely separate from my new humanoid Doug? I cannot access the variable through newHumanoid.bodyParts either.
My current thinking is that I will have to create a new class for bodyParts, and then build a list of bodyParts in the humanoid class. But I wanted a second or third opinion before I pursue that.
Should I even be using enums in this instance? Please help.
Answer by UnityCoach · Nov 10, 2018 at 11:47 AM
Declaring an enum is one thing, then you need to declare a field of that type to store a value.
By the way, you don't need to assign them values, unless you need to "insert" other values in between later.
public enum BodyPart {Arm, Torso, Leg}
[SerializeFIeld] BodyPart oneBodyPart; // this would be one part
[SerializeFIeld] BodyPart[] bodyParts; // this would be an array of parts
It seems like an enum isn't the correct type of variable for what I actually want to do, which is have individual body parts that track their own damage, but thank you so much for explaining how to use enums as I have been confused by them for a while. And it's given me a good outline for a better body parts system.a
Yes, enums are just ints with labels in fact. It works well for finite states like (Idle, Patrolling, Chasing, Fighting, Fleeing, etc) or anything that is mutually exclusive.
I believe a class would probably be a better fit for what you want to do. Like
public enum BodyPartType {Torso, Arm, Leg, Head, Tail}
public enum BodyPartSide {Center, Left, Right}
[System.Serializable]
public class BodyPart
{
public BodyPartType type {get; private set;}
public BodyPartSide side {get; private set;}
public float damageAmount {get; private set;}
public void ApplyDamage (float damage)
{
damageAmount += damage;
if (damageAmount >= maxDamage)
{
// do something to body part
}
}
}
public class CharacterBody : $$anonymous$$onoBehaviour
{
[SerializeField] BodyPart[] bodyParts;
}