2017-04-23 71 views
2

我有一個數據類與存儲在它的cameraPosition。統一修改的值,而無需創建臨時變量

public Vector3 CameraPosition { get { return CameraTransform.position; } } // current position of the camera 

在我的控制器類,我要修改此

void Move() // move with the camera 
    { 
     if (Input.GetKey("w") || data.MousePos.y >= Screen.height - data.BorderSize) 
      data.CameraPosition.z += data.MovementSpeed * Time.deltaTime; 
     if (Input.GetKey("s") || data.MousePos.y <= data.BorderSize) 
      data.CameraPosition.z -= data.MovementSpeed * Time.deltaTime; 
     if (Input.GetKey("d") || data.MousePos.x >= Screen.width - data.BorderSize) 
      data.CameraPosition.x += data.MovementSpeed * Time.deltaTime; 
     if (Input.GetKey("a") || data.MousePos.x <= data.BorderSize) 
      data.CameraPosition.x -= data.MovementSpeed * Time.deltaTime; 
    } 

    void Scroll() // scroll the camera 
    { 
     data.CameraPosition.y -= data.ScrollInput * data.ScrollSpeed * Time.deltaTime; 
    } 

因此,實際上編譯器要我創建臨時變量。我無法修改data.CameraPosition

有沒有一種方法,這樣做沒有臨時變量?

否則我會寫

private void Update() 
    { 
     Vector3 pos = data.CameraPosition; 

     pos = Move(pos); 
     pos = Scroll(pos); 
     pos = LimitValues(pos); 

     data.CameraPosition = pos; 
    } 

    Vector3 Move(Vector3 pos) 
    { 
     if (Input.GetKey("w") || data.MousePos.y >= Screen.height - data.BorderSize) 
      pos.z += data.MovementSpeed * Time.deltaTime; 
     if (Input.GetKey("s") || data.MousePos.y <= data.BorderSize) 
      pos.z -= data.MovementSpeed * Time.deltaTime; 
     if (Input.GetKey("d") || data.MousePos.x >= Screen.width - data.BorderSize) 
      pos.x += data.MovementSpeed * Time.deltaTime; 
     if (Input.GetKey("a") || data.MousePos.x <= data.BorderSize) 
      pos.x -= data.MovementSpeed * Time.deltaTime; 

     return pos; 
    } 

    Vector3 Scroll(Vector3 pos) 
    { 
     pos.y -= data.ScrollInput * data.ScrollSpeed * Time.deltaTime; 

     return pos; 
    } 

    Vector3 LimitValues(Vector3 pos) 
    { 
     pos.x = ClampMovement(data.CameraPosition.x, data.MapLimit.x); 
     pos.y = ClampScroll(data.CameraPosition.y); 
     pos.z = ClampMovement(data.CameraPosition.z, data.MapLimit.y); 

     return pos; 
    } 

而且我認爲,這看起來真的很糟糕。

也許有人知道一招:)

+0

你覺得這有什麼特別的原因,「看起來非常糟糕」? – apk

回答

2

Vector3是值類型(結構)。這意味着你的getter實際返回結構的一個副本,而不是對它的引用。你是在想,data.CameraPosition.x不能被分配到正確的,因爲data.CameraPosition返回值的副本的屬性。修改此副本不會影響原始值(除非您在最後分配)。

只有這樣,才能讓一個Vector3領域的直接任務將是使之成爲公共領域(而不是屬性)。在你的例子中這是不可能的,因爲你的財產指的是CameraTransform.position這不是你班上的領域。

順便說一句,爲了使用data.CameraPosition = pos;你將需要來分配值一個setter:set { CameraTransform.position = value; }

+0

嗯以及我改變了我的財產,以'公共的Vector3 CameraPosition {{返回CameraTransform.position; } set {CameraTransform.position = value; }}'但它仍然不能被修改:/ – Question3r

+0

你將永遠不會成爲能夠直接_modify_它,你只能一個完全新的值賦給它。 – apk

+0

是啊,現在我只寫了這個:https://pastebin.com/rU1mUEFx – Question3r