Unity在不创建临时变量的情况下修改值

时间:2017-04-23 15:59:28

标签: c# unity3d

我有一个数据类,其中存储了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;
    }

我认为,这看起来非常糟糕。

也许有人知道一招:)

1 个答案:

答案 0 :(得分:2)

Vector3是一个值类型(struct)。这意味着你的getter实际上返回了struct的副本,而不是对它的引用。您认为data.CameraPosition.x无法分配给您是正确的,因为属性data.CameraPosition会返回值的副本。修改此副本不会影响原始值(除非您在最后将其分配回来)。

允许直接分配Vector3字段的唯一方法是将其设为公共字段(而不是属性)。这在您的示例中是不可能的,因为您的属性引用CameraTransform.position,而不是您班级中的字段。

顺便说一下,为了使用data.CameraPosition = pos;,你需要一个分配值的setter:set { CameraTransform.position = value; }