Unity 5.4 - 在没有 FoV 操作的情况下缩放 RTS 相机
Unity 5.4 - Zooming RTS camera without FoV manipulation
我正在尝试为我的游戏创建一个 RTS 风格的摄像机控制系统,但我碰壁了,不确定如何继续。
我想要发生的事情如下:
- 鼠标点击 + 拖动 = 在世界各地移动相机(有效)
- 鼠标滚轮点击 + 拖动 = 在世界各地旋转相机(有效)
- 鼠标滚轮 = 缩放 in/out 使用 MoveToward/Transform.Forward..etc(sorta works)
在另一个脚本中,我使用了 FoV 缩放功能,但它对于我想要创建的体验类型来说并不理想。相反,我试图在它指向的方向上物理移动相机。
当前脚本的 90% 功能是因为它可以 执行 上面列出的所有事情,但是当我在滚动缩放后单击 + 拖动以移动到新位置时,相机重置到原始位置。
这是 Update() 中发生的事情:
void Update ()
{
currentPosition = transform.position;
scrollAxis = Input.GetAxis ("Mouse ScrollWheel");
if (Input.GetMouseButtonDown (0))
{
mouseOrigin = Input.mousePosition;
isPanning = true;
}
// cancel on button release
if (!Input.GetMouseButton (0))
{
isPanning = false;
}
//move camera on X & Y
else if (isPanning)
{
Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin);
Vector3 move = new Vector3 (pos.x * -panSpeed, pos.y * -panSpeed, 0);
Camera.main.transform.Translate (move, Space.Self);
transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0 );
transform.localPosition = new Vector3( transform.position.x, transform.position.y - (transform.position.y - (initialPosition.y)), transform.position.z );
}
//rotate camera with mousewheel click
if (Input.GetMouseButton(2)) {
yRotation -= Input.GetAxis("Mouse Y") * rotationSpeed * Time.deltaTime;
yRotation = Mathf.Clamp(yRotation, -80, 80);
xRotation += Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime;
xRotation = xRotation % 360;
transform.localEulerAngles = new Vector3(yRotation + initialRotation.x, xRotation + initialRotation.y, 0);
}
//zoom with scroll
if ( Input.GetAxis("Mouse ScrollWheel") > 0 && !isPanning) {
transform.Translate(Vector3.forward * Time.deltaTime * 10000f * scrollAxis, Space.Self );
transform.localPosition = new Vector3( transform.position.x, transform.position.y, transform.position.z );
}
}
非常感谢任何帮助,谢谢!
在朋友的帮助下解决了。
每次缩放时都需要重置初始 Position Vector3,以防止快速回到原始位置。
if ( Input.GetAxis("Mouse ScrollWheel") > 0) {
transform.Translate(Vector3.forward * Time.deltaTime * 10000f * scrollAxis, Space.Self );
initialPosition = transform.position;
}
我正在尝试为我的游戏创建一个 RTS 风格的摄像机控制系统,但我碰壁了,不确定如何继续。
我想要发生的事情如下:
- 鼠标点击 + 拖动 = 在世界各地移动相机(有效)
- 鼠标滚轮点击 + 拖动 = 在世界各地旋转相机(有效)
- 鼠标滚轮 = 缩放 in/out 使用 MoveToward/Transform.Forward..etc(sorta works)
在另一个脚本中,我使用了 FoV 缩放功能,但它对于我想要创建的体验类型来说并不理想。相反,我试图在它指向的方向上物理移动相机。
当前脚本的 90% 功能是因为它可以 执行 上面列出的所有事情,但是当我在滚动缩放后单击 + 拖动以移动到新位置时,相机重置到原始位置。
这是 Update() 中发生的事情:
void Update ()
{
currentPosition = transform.position;
scrollAxis = Input.GetAxis ("Mouse ScrollWheel");
if (Input.GetMouseButtonDown (0))
{
mouseOrigin = Input.mousePosition;
isPanning = true;
}
// cancel on button release
if (!Input.GetMouseButton (0))
{
isPanning = false;
}
//move camera on X & Y
else if (isPanning)
{
Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin);
Vector3 move = new Vector3 (pos.x * -panSpeed, pos.y * -panSpeed, 0);
Camera.main.transform.Translate (move, Space.Self);
transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0 );
transform.localPosition = new Vector3( transform.position.x, transform.position.y - (transform.position.y - (initialPosition.y)), transform.position.z );
}
//rotate camera with mousewheel click
if (Input.GetMouseButton(2)) {
yRotation -= Input.GetAxis("Mouse Y") * rotationSpeed * Time.deltaTime;
yRotation = Mathf.Clamp(yRotation, -80, 80);
xRotation += Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime;
xRotation = xRotation % 360;
transform.localEulerAngles = new Vector3(yRotation + initialRotation.x, xRotation + initialRotation.y, 0);
}
//zoom with scroll
if ( Input.GetAxis("Mouse ScrollWheel") > 0 && !isPanning) {
transform.Translate(Vector3.forward * Time.deltaTime * 10000f * scrollAxis, Space.Self );
transform.localPosition = new Vector3( transform.position.x, transform.position.y, transform.position.z );
}
}
非常感谢任何帮助,谢谢!
在朋友的帮助下解决了。
每次缩放时都需要重置初始 Position Vector3,以防止快速回到原始位置。
if ( Input.GetAxis("Mouse ScrollWheel") > 0) {
transform.Translate(Vector3.forward * Time.deltaTime * 10000f * scrollAxis, Space.Self );
initialPosition = transform.position;
}