c# - Unity 修改值而不创建临时变量

标签 c# unity-game-engine

我有一个数据类,其中存储了cameraPosition。

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

在我的 Controller 类中,我想修改它

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;
    }

我认为,这看起来真的很糟糕。

也许有人知道一个窍门:)

最佳答案

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

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

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

关于c# - Unity 修改值而不创建临时变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43573368/

相关文章:

c# - 分组相似测试 : yay or nay?

c# - 如何将 Azure 函数的连接字符串加密到 ServiceBus

c# - 数据绑定(bind)到渐变停止时找不到可视化树元素

c# - 如何停止 Unity 游戏对象的移动和/或旋转

unity-game-engine - Unity3d 无法在 Mac OS high Sierra 上正常工作

c# - “System.Data.Entity.ModelConfiguration.ModelValidationException”出现在 EntityFramework.dll 中,但未在用户代码中处理

c# - 在 asp.net core 2 graphql 端点的情况下,如何提取请求 header 并将其传递给业务逻辑?

c# - Unity Shader - 如何有效地重新着色特定坐标?

mysql - 跟踪玩家何时进入/离开游戏中的区域

ios - 可以在 unity3d 中创建一个单独的 watchkit 应用程序吗?