如何阻止我的相机旋转?

时间:2018-01-23 02:18:03

标签: c# unity3d rotation raycasting mouse-position

我做了我的3D Agario游戏的前身。这是一款面向鼠标的游戏。您可以使用鼠标来控制大部分动作。这包括相机的旋转。

我的问题是相机不会停止旋转。这是因为很难将鼠标置于屏幕中心,我使相机旋转的方式是使用正弦方程。

这是我的代码:

//public
public GameObject player;
public float rotationSpeed;

//v3
private Vector3 mousePos;
private Vector3 playerPos;
private Vector3 camPos;

//float
private float sideX;
private float sideZ;
private float sideC;
private float camX;
private float camZ;
private float camC;
private float rotX;
private float rotZ;
private float rotC;
private float rotAngle;
private Quaternion currRotation;

//camera
private Camera hitCam;

void Start ()
{
    transform.rotation = Quaternion.Euler(30, 0, 0);
    transform.position = new Vector3(0, 15, 0);
}
void LateUpdate ()
{
    mousePos = HitCameraController.mousePos;
    playerPos = player.transform.position;

    sideX = (mousePos.x - playerPos.x);
    sideZ = (mousePos.z - playerPos.z);
    sideC = (Mathf.Sqrt(Mathf.Pow(sideX, 2) + Mathf.Pow(sideZ, 2)));

    camC = 15;
    camX = (camC * sideX) / sideC;
    camZ = (camC * sideZ) / sideC;

    rotX = (sideX + camX);
    rotZ = (sideZ + camZ);
    rotC = (Mathf.Sqrt(Mathf.Pow(rotX, 2) + Mathf.Pow(rotZ, 2)));

    if (rotX >= 0 && rotZ >= 0)
    {
        rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    if (rotX >= 0 && rotZ <= 0)
    {
        rotAngle = 180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    if (rotX <= 0 && rotZ >= 0)
    {
        rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    if (rotX <= 0 && rotZ <= 0)
    {
        rotAngle = -180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    camPos = new Vector3((playerPos.x - camX), 15, (playerPos.z - camZ));
    currRotation = Quaternion.Euler(30, rotAngle, 0);

    // Move Camera
    transform.position = camPos;

    // Rotate Camera

    /*transform.rotation = Quaternion.RotateTowards(
        transform.rotation, currRotation, 
        (rotationSpeed * Time.deltaTime));*/

    transform.rotation = currRotation;
}

我想制作一种“安全区”,以防止计算旋转角度。例如,如果我将鼠标放在中心的某个边界内,相机将不会旋转。

我尝试使用“或”语句创建边界,但它没有给我我想要的结果(即使我的鼠标在边界时相机仍然会旋转。相机会停在一些尝试,但在这样做之前会发生极大的抖动。)

我确切地知道为什么会发生这种情况:光线没有投射在静态相机上;因此,即使我不移动鼠标,鼠标坐标也会始终改变。我尝试将光线投射到“命中”相机(静止相机),但是后续相机无法拾取鼠标移动。我不知道如何解决这个问题,除了为头脑风暴提供直观的解决方案,但我的大脑只能创新这么多。

如果你能想到我面前的解决方案,请以任何方式告诉我。

1 个答案:

答案 0 :(得分:0)

[...]
void LateUpdate ()
{
    mousePos = HitCameraController.mousePos;
    playerPos = player.transform.position;

    sideX = (mousePos.x - playerPos.x);
    sideZ = (mousePos.z - playerPos.z);

    sideC = (Mathf.Sqrt(Mathf.Pow(sideX, 2) + Mathf.Pow(sideZ, 2)));

    // New Stuff
    sideC -= 5f; // substract the safe-zone-radius
    if(sideC < 0f)
    {
        // Inside safe-zone, do nothing.
        sideC = 0f;
        sideX = 0f;
        sideZ = 0f;
    }else{
        // Outside safe-zone, correct values to avoid jumping.
        float x_ratio = sideX / sideZ; // be careful with "divide by zero"
        float z_ratio = sideZ / sideX;
        sideX -= 5 * x_ratio;
        sideZ -= 5 * z_ratio;
    }
    // End New Stuff

    camC = 15;
    camX = (camC * sideX) / sideC;
    camZ = (camC * sideZ) / sideC;

    rotX = (sideX + camX);
    rotZ = (sideZ + camZ);
    rotC = (Mathf.Sqrt(Mathf.Pow(rotX, 2) + Mathf.Pow(rotZ, 2)));

    if (rotX >= 0 && rotZ >= 0)
    {
        rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    if (rotX >= 0 && rotZ <= 0)
    {
        rotAngle = 180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    if (rotX <= 0 && rotZ >= 0)
    {
        rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }
    if (rotX <= 0 && rotZ <= 0)
    {
        rotAngle = -180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
    }

    camPos = new Vector3((playerPos.x - camX), 15, (playerPos.z - camZ));
    currRotation = Quaternion.Euler(30, rotAngle, 0);