Unity - Get/Set 属性访问器

Posted chenzirong1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity - Get/Set 属性访问器相关的知识,希望对你有一定的参考价值。

一、Get/Set 的疑问

  通常来说,我们在 Unity 内声明一些属性,比如:

1     private float hp;
2 
3     public int index;

  但是,偶尔可能会看到另外一些属性声明的方法,比如:

 1     public float Hp
 2     {
 3         get
 4         {
 5             return Hp;
 6         }
 7         set
 8         {
 9             Hp = value;
10         }
11     }

  所以我们就会有疑问:这个 get/set 是什么?为什么要这样写?有什么作用?

技术图片

二、Get/Set 的理解

  首先,这个 get 我们可以理解为 “读”,如果你为一个属性声明了 get 方法,那么每当你调用该属性的时候,就会调用 get 内的方法,也就是我们看到的 get { return Num;}引用该属性后就会调用该属性的 get 方法,在该属性的 get 方法内返回了该属性本身,所以我们就可以拿到这个属性的值。

  然后是这个 set,我们可以理解为 “写”,如果你为一个属性声明了 set 方法,那么每当你设置该属性的值的时候,就会调用 set 内的方法,也就是我们看到的 set { Hp = value;}这个 value 就是你在外部为该属性设置的值。比如:你在某个脚本里设置 Hp 的值,Hp = 100 ;那么设置的时候就会调用 set 方法,这个时候 value 就等于 100

三、Get/Set 的基本用法

  使用前提:当要访问被 private 封装的属性的时候

  提供访问方式的原因:之所以用 private 封装,又对外提供访问方式(Get/Set),是因为可以在访问方式中加入逻辑判断等语句,对访问的数据进行操作,提高代码的健壮性。

  正常我们声明变量,有两种方式:private public,其实这两个也是有 get/set 的,只不过被隐藏了。他们都是可读可取的属性,当我们知道 get/set 的用法之后,就可以把一个属性设置为只读,或者是只写的属性,又或者是可读可写的属性。

 1     // 只读属性:只能读取该属性的值
 2     private float num_A
 3     {
 4         get
 5         {
 6             return num_A;
 7         }
 8     }
 9     // 只写属性:只能给改属性设置值
10     private float num_B
11     {
12         set
13         {
14             num_B = value;
15         }
16     }
17     // 可读可写的属性
18     private float num_C
19     {
20         get
21         {
22             return num_C;
23         }
24         set
25         {
26             num_C = value;
27         }
28     }

四、Get/Set 的具体用法

  通常来说,我们很少会直接设置属性的读写属性,通常会通过设置一个外部访问器来限制该属性的内容。比如:

 1     private float hp;
 2 
 3     public float Hp
 4     {
 5         get
 6         {
 7             return hp;
 8         }
 9         set
10         {
11             hp = value;
12         }
13     }

  在上面的代码中,Hp 就是 hp 的访问器,我们在外部需要获取或者设置 hp 值的时候,访问的是 Hp,获取 Hp 的值,get 中返回的是 hp,设置 Hp 的值,在 set 中将你设置的值 value 赋值给了 hp,这样就达到了访问 hp 的目的。

  那为什么要多次一举,不直接将 hp 设置为 public 呢,这是因为安全问题,我们可以通过修改 Hp 的限制条件,来限制最终 hp 的值,来达到一个安全的保障。

  比如,要让 hp 始终保持在 0~100 之间,你的 Hp 可以这样写:

 1     private float hp;
 2 
 3     public float Hp
 4     {
 5         get
 6         {
 7             return hp;
 8         }
 9         set
10         {
11             if (value > 100)
12             {
13                 value = 100;
14             }
15             else if(value < 0)
16             {
17                 value = 0;
18             }
19             hp = value;
20         }
21     }

  这样一来,不管在外部怎么设置 Hp 的值,hp 的数值永远都不会大于 100 或小于 0,访问器 Hp 就相当于一个滤网,将不合格的过滤掉,来保证后方的安全性。

以上是关于Unity - Get/Set 属性访问器的主要内容,如果未能解决你的问题,请参考以下文章

unity第二周:属性的get,set

Unity笔记角色信息常用访问器get/set

C#属性访问器

关于C# get set的简单用法

Python中的property类和@property装饰器

JS对象属性中get/set与getter/setter是什么