2017-04-23 4 views
2

私はcameraPositionが格納されたデータクラスを持っています。私のコントローラクラスでUnityは、一時変数を作成せずに値を変更します。

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

どれでも特別な理由:ところで

は、data.CameraPosition = pos;を使用するために、あなたは値を割り当てセッターが必要になるだろうか? – apk

答えて

2

Vector3は値型(構造体)です。これは、ゲッターが実際に構造体のコピーを返すことを意味し、参照を参照しません。属性data.CameraPositionは値のコピーを返すので、data.CameraPosition.xを割り当てることはできません。このコピーを変更しても、元の値には影響しません(最後に指定しない限り)。

Vector3のフィールドを直接割り当てることができる唯一の方法は、(プロパティではなく)パブリックフィールドにすることです。これは、あなたのプロパティがCameraTransform.positionを参照しているため、あなたの例では不可能です。あなたのクラスのフィールドではありません。あなたは、これは「本当に悪いに見える」と思うset { CameraTransform.position = value; }

+0

私はプロパティを 'public Vector3 CameraPosition {get {return CameraTransform.position; } set {CameraTransform.position = value; }} 'しかし、まだ変更することはできません:/ – Question3r

+0

あなたはそれを直接_modify_することはできません、あなたはそれに完全に新しい値を割り当てることができます。 – apk

+0

ええ、今私はちょうどここにこれを書きました:https://pastebin.com/rU1mUEFx – Question3r

関連する問題