简体   繁体   English

在 Unity 中移动相机的脚本中重置鼠标的位置

[英]resetting the position of the mouse in script that moves the camera in Unity

First off I'm very new to Unity so bear with me.首先,我对 Unity 很陌生,所以请耐心等待。 I have a drop down menu that changes to different cameras when the user wants to change camera view.我有一个下拉菜单,当用户想要更改相机视图时,该菜单会更改为不同的相机。 The problem I have with this is that if you change the view at all like using the mouse wheel to zoom in or out the view stays zoomed in or out still when you change cameras, instead of resetting to the starting position when you switch cameras.我遇到的问题是,如果您完全更改视图,例如使用鼠标滚轮放大或缩小,则在更换相机时视图保持放大或缩小不变,而不是在切换相机时重置到起始位置。 I would like to make it so when you change cameras the starting position of the mouse resets.我想这样做,当您更换相机时,鼠标的起始位置会重置。 I have a function called "reset()" in my script that handles mouse movement that I call from a different script that when you change the cameras with the drop down I want it to reset the starting variables back to the starting position.我的脚本中有一个名为“reset()”的函数,它处理我从另一个脚本调用的鼠标移动,当您使用下拉菜单更改摄像机时,我希望它将起始变量重置回起始位置。 Any guidance on this would be much appreciated.对此的任何指导将不胜感激。 The reset function is at the bottom of my code.重置功能在我的代码底部。 I am trying to store the starting position in private Vector3 positionStore;我正在尝试将起始位置存储在私有 Vector3 positionStore 中; and trying to execute transform.position = positionStore;并尝试执行 transform.position = positionStore; to do the actual transformation.做实际的改造。

using UnityEngine;
using System.Collections;

[AddComponentMenu("Camera-Control/3dsMax Camera Style")]
public class maxCamera : MonoBehaviour
{
public Transform target;
public Vector3 targetOffset;
public float distance = 5.0f;
public float maxDistance = 20;
public float minDistance = .6f;
public float xSpeed = 200.0f;
public float ySpeed = 200.0f;
public int yMinLimit = -80;
public int yMaxLimit = 80;
public int zoomRate = 40;
public float panSpeed = 0.3f;
public float zoomDampening = 5.0f;

private float xDeg = 0.0f;
private float yDeg = 0.0f;
private float currentDistance;
private float desiredDistance;
private Quaternion currentRotation;
private Quaternion desiredRotation;
private Quaternion rotation;
private Vector3 position;

private Quaternion currentRotationStore;
private Quaternion desiredRotationStore;
private Quaternion rotationStore;
private Vector3 positionStore;
Vector3 originalPos;

void Start() { Init(); }
void OnEnable() { Init(); }

public void Init()
{
    originalPos = new Vector3(gameObject.transform.position.x, gameObject.transform.position.y, gameObject.transform.position.z);

    //If there is no target, create a temporary target at 'distance' from the cameras current viewpoint
    if (!target)
    {
        GameObject go = new GameObject("Cam Target");
        go.transform.position = transform.position + (transform.forward * distance);
        target = go.transform;
    }

    distance = Vector3.Distance(transform.position, target.position);
    currentDistance = distance;
    desiredDistance = distance;

    //be sure to grab the current rotations as starting points.
    position = transform.position;
    rotation = transform.rotation;
    currentRotation = transform.rotation;
    desiredRotation = transform.rotation;

    //trying to store these values to be used later in reset
    positionStore = transform.position;
    currentRotationStore = transform.rotation;

    xDeg = Vector3.Angle(Vector3.right, transform.right);
    yDeg = Vector3.Angle(Vector3.up, transform.up);
}

/*
 * Camera logic on LateUpdate to only update after all character movement logic has been handled. 
 */
void LateUpdate()
{
    // If Control and Alt and Middle button? ZOOM!
    if (Input.GetMouseButton(2) && Input.GetKey(KeyCode.LeftAlt) && Input.GetKey(KeyCode.LeftControl))
    {
        desiredDistance -= Input.GetAxis("Mouse Y") * Time.deltaTime * zoomRate * 0.125f * Mathf.Abs(desiredDistance);
    }
    // If middle mouse and left alt are selected? ORBIT
    else if (Input.GetMouseButton(2) && Input.GetKey(KeyCode.LeftAlt))
    {
        xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
        yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

        ////////OrbitAngle

        //Clamp the vertical axis for the orbit
        yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
        // set camera rotation 
        desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
        currentRotation = transform.rotation;

        rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening);
        transform.rotation = rotation;
    }
    // otherwise if middle mouse is selected, we pan by way of transforming the target in screenspace
    else if (Input.GetMouseButton(2))
    {
        //grab the rotation of the camera so we can move in a psuedo local XY space
        target.rotation = transform.rotation;
        target.Translate(Vector3.right * -Input.GetAxis("Mouse X") * panSpeed);
        target.Translate(transform.up * -Input.GetAxis("Mouse Y") * panSpeed, Space.World);
    }

    ////////Orbit Position

    // affect the desired Zoom distance if we roll the scrollwheel
    desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs(desiredDistance);
    //clamp the zoom min/max
    desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);
    // For smoothing of the zoom, lerp distance
    currentDistance = Mathf.Lerp(currentDistance, desiredDistance, Time.deltaTime * zoomDampening);

    // calculate position based on the new currentDistance 
    position = target.position - (rotation * Vector3.forward * currentDistance + targetOffset);
    transform.position = position;
}

private static float ClampAngle(float angle, float min, float max)
{
    if (angle < -360)
        angle += 360;
    if (angle > 360)
        angle -= 360;
    return Mathf.Clamp(angle, min, max);
}

public void reset(){
    transform.position = positionStore;
}
}

The problem here is that your LateUpdate() is firing after your Reset(), and the desiredDistance parameter remains unchanged.这里的问题是您的 LateUpdate() 在您的 Reset() 之后触发,并且所需的距离参数保持不变。 What's happening is you reset the position of your game object, but in the LateUpdate(), the position is being set back the zoomed distance.发生的事情是您重置了游戏对象的位置,但在 LateUpdate() 中,位置被设置回缩放距离。 You'll want to reset your desiredDistance in your Reset() method.您需要在您的 Reset() 方法中重置您所需的距离。 It will fixed your problem.它会解决你的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM