Why?
让chatGpt
回答我们的问题。
在C#游戏开发中,不建议过多使用public是因为它可能会导致以下问题:
- 封装性:
public
变量和方法可以被其他类直接访问和修改,这会降低代码的封装性,使得代码难以维护和扩展。 - 安全性:公共变量和方法容易受到非法访问和修改,从而破坏游戏的安全性。
- 维护性:如果过多使用
public
,当需要修改某个变量或方法时,需要修改大量的代码,这将增加代码的维护难度。
因此,使用private
或protected
来限制变量和方法的访问范围,可以增强代码的封装性、安全性和维护性。
例子:
public class TestingGenerics1 : MonoBehaviour
{
public float speed;
}
//公开后就可以让任意的类在声明类后就可以调用该类的speed变量。
public class SecondTest{
private TestingGenerics1 testingGenerics1;
private void TestFunction(){
//修改
testingGenerics1.speed=10f;
}
}
可是我们并不想失去可以在Unity
公开调整的好处,那么可以改写成如下:
[SerializeField] private float speed;
不过这样依旧不允许其他的类对该类进行访问修改,可以看出它跟public
还是有区别的,像这样的特性就很适合同一个游戏的合作开发。
[SerializeField]
是什么?
我们得知道什么是serialization
C#
中的序列化(serialization)是指将对象转换为字节串的操作。
Unity 中的一个好处是任何可序列化字段都可以通过 Inspector
栏 进行操作
回到正题
[SerializeField]
其实是一个属性,表示该字段是可序列化的,但是添加 [SerializeField]
并不能使检查器可以访问所有内容。
public class Test : MonoBehaviour
{
// static
[SerializeField] static string sampleField_1;
// get and set
[SerializeField] string sampleField_2 { get; set; }
// UnityEngine.Object
[SerializeField] Sample sampleField_3;
}
class Sample { }
额外拓展
假设我创建了一个名为
VariableA
的变量,我希望它公开,但我不想在inspector
显示这个变量?
[System.NonSerialized] public int VariableA;