Я сделал предшественник своей игры 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;
}
Я хочу сделать своего рода «безопасную зону», которая предотвратит вычисление угла поворота. Например, если я держу указатель мыши в пределах определенной границы в центре, камера не будет вращаться.
Я попытался установить границу с помощью оператора «или», но это не дало мне результата, который я искал (камера все равно вращалась, даже когда моя мышь находилась на границе. Камера останавливалась при некоторых попытках, но перед этим он будет сильно дрожать.)
Я точно знаю, почему это происходит: луч не попадает на фотоаппарат; следовательно, координата мыши всегда будет меняться, даже если я не перемещаю мышь. Я попытался направить луч на камеру "Hit" (неподвижную камеру), но камера слежения не могла уловить движение мыши. Я не знаю, как решить эту проблему, кроме как продолжать мозговой штурм в поисках интуитивно понятного решения, но мой мозг может только так много инноваций.
Если вы могли придумать решение до меня, дайте мне знать любым способом.