Unity-Get/Set属性访问器详解
目录
1.博文介绍
本片博客主要介绍关于属性访问器get/set的一些知识,对get/set的概念还比较模糊的同学可以看一看本篇博客。
2.get/set理解
通常的来说在Unity内我们声明一些属性如下所示
private float num;
public int index;
但是对于一些小伙伴们来说偶尔可能会看到如下的一些属性声明方式
public float Num
{
get { return Num; }
set { Num= value; }
}
那这个时候你可能就会有疑问了,这个get/set是什么鬼,为什么要这样写,他是干什么的。
不要紧,我们一点点来解释。
首先这个get我们可以理解为 “读”,如果你为一个属性声明了get方法,那么每当你调用该属性的时候,就会调用get内的方法,这里我们可以看到 get{ return Num;},引用该属性后就会调用该属性的get方法,在该属性的get方法内返回了该属性本身,所以我们就拿到了这个属性的值。
然后是这个set,我们可以理解为 “写”,如果你为一个属性声明了set方法,那么每当你设置该属性的值的时候,就会调用set内的方法,这个我们可以看到 set { Num = value;},这个value就是你在外部为该属性设置的值,比如:你在某个脚本里设置 Num 的值,Num = 1.1f ;那么设置的时候就会调用set方法,这个时候value就等于1.1f。
正常我们声明变量,有两种方式,就是private和public,其实这俩也是有get/set的,只不过隐藏了,他们都是可读可取的属性,现在我们知道get/set的用法之后,就可以把一个属性设置为只读,或者是只写的属性,又或者是可读可写的属性。
private float num//只读属性,只能读取该属性的值
{
get { return num; }
}
private float num//只写属性,只能给该属性设置值
{
set { num = value; }
}
private float num//可读可写的属性
{
get { return num; }
set { num = value; }
}
3.具体用法
通常来说我们很少会直接设置该属性的读写属性,我们会通过在设置一个外部访问器,来限制该属性的内容,如下:
private float num;
public float Num
{
get { return num; }
set { num = value; }
}
如上内容中,Num就是num的访问器,我们在外部需要获取或者设置num的值的时候,访问的是Num,你获取Num的值,get中返回的是num,你设置Num的值,set 中是将你设置的值value赋值给了num,如此就达到了访问num的目的,为什么要多次一举不直接将num设置为public呢,这里是因为安全的问题,你可以通过修改Num的限制条件,来限制最终num的值,来达到一个安全的保障,比如你的num是小于等于10的,你的Num可以这样写:
private float num;
public float Num
{
get { return num; }
set
{
if (value>10)
{
value = 10;
}
num = value;
}
}
如此一来,不管你在外部怎么设置Num的值,num的数值永远都不会大于10,访问器Num就相当于一个滤网,将不合格的过滤掉,来保证后方的安全性。
下面我们设置一个情景来展示具体的用法:
人物血量PlayerHp,血量在0-100之间,血量变化的时候会调用方法HpFuc();
脚本1:
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
/// <summary>
/// 显示血量的Text
/// </summary>
public Text hpShow;
/// <summary>
/// 人物血量
/// </summary>
private float playerHp;
/// <summary>
/// 人物血量的外部访问器
/// </summary>
public float PlayerHp
{
get { return playerHp; }
set
{
if (value<0) //限制血量不能小于0
{
value = 0;
}
else if (value>100) //限制血量不能大于100
{
value = 100;
}
playerHp = value;
HpFuc(); //每次掉血或者加血的时候调用该方法
}
}
void HpFuc()
{
hpShow.text = "血量:"+playerHp;
}
}
在该脚本中我们设置了,用于显示血量的Text--hpShow,人物的血量playerHp,还有人物血量的访问器PlayerHp,这里给PlayerHp的set中添加限制,不能大于100或者小于0,且每次设置PlayerHp会调用方法HpFuc(),该方法将血量的值显示在Text中。
脚本2:
using UnityEngine;
public class TestTwo : MonoBehaviour
{
public Test testScript;
void Update () {
if (Input.GetKeyDown(KeyCode.A))
{
testScript.PlayerHp += 21;
}
else if (Input.GetKeyDown(KeyCode.D))
{
testScript.PlayerHp -= 31;
}
}
}
在该脚本中,我们获取了脚本一,并设置点击键盘A后脚本一的PlayerHp浮点值增加21,点击键盘D后脚本一的P'layerHp浮点值减少31。
显示结果如下:
4.推送
本篇所用源码:https://download.csdn.net/download/mr_sun88/10792242 (需要的自行下载)
5.结语
本篇文章就到此结束了,希望各位同学能够对get/set有一个更加深刻的理解。另博主能力有限,文中若有错误的地方期望各位看家可以指点交流。
QQ交流群:806091680(Chinar)
该群为CSDN博主Chinar所创,推荐一下!我也在群里!
本文属于原创文章,转载请著名作者出处!!!!!