[英]Unity3D C# private variable will not update with public setter function
來自BoardScript.cs的最少代碼
public class BoardScript : MonoBehaviour {
private float angle;
private static BoardScript instance;
void Awake() {
if (instance == null) {
instance = this;
}
else if (instance != this) {
Destroy(gameObject);
}
}
Start(){
angle = 0.5f;
}
Update(){
Debug.Log("angle = " + angle); // logged angle never changes.
Debug.Log("GetAngle() returns " + GetAngle()); // also never changes...
}
public SetAngle(float arg) {
angle = arg;
Debug.Log("angle set to " + angle);
// Above always logs new angle as called fron Settings.cs.
}
private float GetAngle() { // only use is for debugging this issue.
Debug.Log("angle is " + angle); // Does not log newly set angle.
return angle;
}
}
最少的代碼Settings.cs
private GameObject theBoard;
public void SetBoardAngule(float arg) {
theBoard.GetComponent<BoardScript>().SetAngle(arg);
Debug.Log("Settings - SetAngle to " + arg); // Logs correct angle.
}
無論在方法SetAngle()中將其設置為什么,更新函數都會記錄“ angle = 0.5”。 對我來說,這似乎非常簡單。 我做錯了什么?
首先第一件事:您的吸氣劑安裝工一切都很好。
其他內容:首先,如果您來自Java世界,則無需為getter setter創建函數:
public SetAngle(float arg) {
angle = arg;
Debug.Log("angle set to " + angle);
// Above always logs new angle as called fron Settings.cs.
}
private float GetAngle() { // only use is for debugging this issue.
Debug.Log("angle is " + angle); // Does not log newly set angle.
return angle;
}
可以轉換為:
public float Angle
{
get{return _angle;}
set{_angle = value;}
}
第二,我不確定為什么不醒着創建對象就破壞對象:但是這里要做的是,如果對象不存在,則創建對象,....否則,如果對象存在,則破壞對象,但是不創造另一個。
第三:這也與第二有關:我們正在創建單例,只有一個類的實例,如果這是您想要的,有很多方法可以實現,但是您必須相應地設置變量:當前,您正在設置(此實例)上的值(可能會與(存儲的實例)不同),一旦發生,您將丟失指針,必須在singleton類上調用它:
public float Angle
{
get{return BoardScript.instance._angle;}
set{BoardScript.instance._angle = value;}
}
代替:
public float Angle
{
get{return this._angle;}
set{this._angle = value;}
}
第四:這又與第二相關:首先,您的對象實例將存儲在實例變量中,但是如果您創建另一個調用喚醒的對象(我忘記了喚醒的工作方式和調用方式),則該對象將導致當前對象被獲取處置,我不確定這是否是您想要的行為,只是說...
void Awake() {
if (instance == null) {
instance = this;
}
else if (instance != this) {
Destroy(gameObject);
}
}
正如評論員指出的,變化
private static BoardScript instance;
至
public BoardScript instance;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.