C# properties
When assigning values to class variables, such as MyClass.x = 10;
, there are a couple of important things to take care of. First, you'll typically want to validate the value being assigned, ensuring that the variable is always valid. Typical cases include clamping an integer between a minimum and maximum range or allowing only a limited set of strings for a string variable. Second, you might need to detect when a variable changes, initiating other dependent functions and behaviors. C# properties let you achieve both these features. Refer to the following code sample 1-15, which limits an integer between 1
and 10
and prints a message to the console whenever it changes:
01 using UnityEngine; 02 using System.Collections; 03 //------------------------------------------------------ 04 //Sample class - can be attached to object as a component 05 public class Database : MonoBehaviour 06 { 07 //------------------------------------------------------ 08 //Public property for private variable iMyNumber 09 //This is a public property to the variable iMyNumber 10 public int MyNumber 11 { 12 //Called when retrieving value 13 get 14 { 15 return iMyNumber; //Output iMyNumber 16 } 17 18 //Called when setting value 19 set 20 { 21 //If value is within 1-10, set number else ignore 22 if(value >= 1 && value <= 10) 23 { 24 //Update private variable 25 iMyNumber = value; 26 27 //Call event 28 NumberChanged(); 29 } 30 } 31 } 32 //------------------------------------------------------ 33 //Internal reference a number between 1-10 34 private int iMyNumber = 0; 35 //------------------------------------------------------ 36 // Use this for initialization 37 void Start () 38 { 39 //Set MyNumber 40 MyNumber = 11; //Will fail because number is > 10 41 42 //Set MyNumber 43 MyNumber = 7; //Will succeed because number is between 1-10 44 } 45 //------------------------------------------------------ 46 //Event called when iMyNumber is changed 47 void NumberChanged() 48 { 49 Debug.Log("Variable iMyNumber changed to : " + iMyNumber.ToString()); 50 } 51 //------------------------------------------------------ 52 } 53 //------------------------------------------------------
The following are the comments for code sample 1-15:
- Line 10: A public integer property is declared. This property is not an independent variable but simply a
wrapper
andaccessor
interface for the private variableiMyNumber
, declared in line 34. - Line 13: When
MyNumber
is used or referenced, the internalget
function is called. - Line 14: When
MyNumber
is assigned a value, the internalset
function is called. - Line 25: The
set
function features an implicit argument value that represents the value to be assigned. - Line 28: The event
NumberChanged
is called when theiMyNumber
variable is assigned a value.Note
Properties and Unity
Properties are useful to validate and control the assignment of values to variables. The main problem with using them in Unity concerns their visibility in the Object Inspector. Specifically, C# properties are not shown in the Object Inspector. You can neither get nor set their values in the editor. However, community-made scripts and solutions are available that can change this default behavior, for example exposing C# properties. These scripts and solutions can be found at http://wiki.unity3d.com/index.php?title=Expose_properties_in_inspector.
More information on Properties in C# can be found at http://msdn.microsoft.com/en-GB/library/x9fsa0sw.aspx.