Basic Attributes
While you can use any attribute solution you want, I’ve included a ‘Basic Attributes’ solution for you.
The Basic Attributes component is actually more advanced than a simple list of floats. It allows you to assign attributes of different types as well as ‘tag’ objects.
Simply select the value type and press the ‘+’ button to add the attribute. You can change the name as needed.
The following types are allowed:
- Float
- Integer
- Boolean
- Tag
- String
- Vector2
- Vector3
- Quaternion
- Transform
- GameObject
Tags
Tags are similar to Unity’s tag field for objects except you can assign multiple tags to a single item.
Tags have no actual value. It’s simply a matter if the named tag exists or not.
Code
To access the attributes through code, you can use exposed functions like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 using UnityEngine;
using com.ootii.Actors.Attributes;
public class SampleComponent : MonoBehaviour
{
public void SomeFunction()
{
BasicAttributes lAttributes = gameObject.GetComponent<BasicAttributes>();
lAttributes.AddAttribute("Health", typeof(float));
float lValue = lAttributes.GetAttributeValue<float>("Health");
lAttributes.SetAttributeValue<float>("Health", 100f);
lAttributes.AttributeExists("Tag1");
lAttributes.AttributesExist("Tag1,Tag2", true);
lAttributes.RemoveAttribute("Health");
}
}
Events
Basic Attributes also support events. In this way, you write code that is called when attribute values change. There’s three ways to do this:
OnAttributeValueChangedEvent
This is a code based approach where you set a function as the handler for the property. Following standard C# practices, you’d add a function like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 using UnityEngine;
using com.ootii.Actors.Attributes;
public class AttributeChangeHandler : MonoBehaviour
{
void Start()
{
BasicAttributes lAttributes = gameObject.GetComponent<BasicAttributes>();
lAttributes.OnAttributeValueChangedEvent += OnValueChanged;
}
void OnValueChanged(BasicAttribute rAttribute, object rOldValue)
{
// Code here
}
}
Unity Events
This approach allows you to use standard Unity events for handling an AttributeMessage that describes the value change.
In this case, you assign the function that will handle the AttributeMessage. Then, you can interrogate it. The AttributeMessage class has the following properties:
- Attribute – BasicAttribute that changed
- Value – object that is the old value before the change
Event System – Dispatcher
If you use my Event System – Dispatcher asset, you can listen for a message where Type is equal to AttributeMessage.MSG_VALUE_CHANGED (5200).
You can see other message ID values here.
Notes
Any attribute solution you use will need to implement the IAttributeSource interface. This interface provides the basic blueprint for how to get and set attribute values.