我有一个存储有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;
}
而且我认为,这看起来真的很糟糕。
也许有人知道一个把戏:)
最佳答案
Vector3
是一个值类型(结构)。这意味着您的getter实际上返回了该结构的副本,而不是对其的引用。您认为不能分配data.CameraPosition.x
是正确的,因为属性data.CameraPosition
返回该值的副本。修改此副本不会影响原始值(除非您在末尾重新分配它)。
允许直接分配Vector3
的字段的唯一方法是将其设置为公共字段(而不是属性)。在您的示例中这是不可能的,因为您的属性引用了CameraTransform.position
,而whh不是您班级中的一个字段。
顺便说一句,要使用data.CameraPosition = pos;
,您将需要一个分配器来分配值:set { CameraTransform.position = value; }