Всем привет! Есть проблема с unity3d

124
10 декабря 2020, 13:40

Впервые сел за этот движок и нашел скрипт для свободной камеры, так вот мне нужно её ограничить по осям z, y, и x. Тк я не хочу что-бы объект вылетал за заданные мной рамки. Сама камера:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFly : MonoBehaviour {
    public float mouseSensitivity = 3.0f;
    public float speed = 2.0f;
    private Vector3 transfer;
    public float minimumX = -360F;
    public float maximumX = 360F;
    public float minimumY = -60F;
    public float maximumY = 60F;
    float rotationX = 0F;
    float rotationY = 0F;
    Quaternion originalRotation;

    void Start() {
        originalRotation = transform.rotation;
    }
    void Update() {
        // Движения мыши -> Вращение камеры
        rotationX += Input.GetAxis("Mouse X") * mouseSensitivity;
        rotationY += Input.GetAxis("Mouse Y") * mouseSensitivity;
        rotationX = ClampAngle (rotationX, minimumX, maximumX);
        rotationY = ClampAngle (rotationY, minimumY, maximumY);
        Quaternion xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
        Quaternion yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left);
        transform.rotation = originalRotation * xQuaternion * yQuaternion;
        // перемещение камеры
        transfer = transform.forward * Input.GetAxis("Vertical");
        transfer += transform.right * Input.GetAxis("Horizontal");
        transform.position += transfer * speed * Time.deltaTime;
    }
    public static float ClampAngle (float angle, float min, float max)
    {
        if (angle < -360F) angle += 360F;
        if (angle > 360F) angle -= 360F;
        return Mathf.Clamp (angle, min, max);
    }
}

По поводу ограничения обзора все понятно, тут имеются публичные переменные класса. Хотелось бы что-то вроде если позиция.камера.х = нужное значение по x => двигать камеру в нужное значение по x. Сделать бы что-то вроде тупика. Буду рад любой помощи.

Answer 1

Попробуйте этот код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFly : MonoBehaviour
{
    public float mouseSensitivity = 3.0f;
    public float speed = 2.0f;
    private Vector3 transfer;
    public float minimumX = -360F;
    public float maximumX = 360F;
    public float minimumY = -60F;
    public float maximumY = 60F;
    float rotationX = 0F;
    float rotationY = 0F;
    Quaternion originalRotation;
    const float minCamX = -400; // минимальная позиция по X
    const float maxCamX = 400; // максимальная позиция по X
    const float minCamY = -100; // минимальная позиция по Y
    const float maxCamY = 100; // максимальная позиция по Y
    const float minCamZ = -400; // минимальная позиция по Z
    const float maxCamZ = 400; // максимальная позиция по Z
    void Start()
    {
        originalRotation = transform.rotation;
    }
    void Update()
    {
        // Движения мыши -> Вращение камеры
        rotationX += Input.GetAxis("Mouse X") * mouseSensitivity;
        rotationY += Input.GetAxis("Mouse Y") * mouseSensitivity;
        rotationX = ClampAngle(rotationX, minimumX, maximumX);
        rotationY = ClampAngle(rotationY, minimumY, maximumY);
        Quaternion xQuaternion = Quaternion.AngleAxis(rotationX, Vector3.up);
        Quaternion yQuaternion = Quaternion.AngleAxis(rotationY, Vector3.left);
        transform.rotation = originalRotation * xQuaternion * yQuaternion;
        // перемещение камеры
        transfer = transform.forward * Input.GetAxis("Vertical");
        transfer += transform.right * Input.GetAxis("Horizontal");
        transform.position += transfer * speed * Time.deltaTime;
        RestrictionCam();
    }
    public static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360F) angle += 360F;
        if (angle > 360F) angle -= 360F;
        return Mathf.Clamp(angle, min, max);
    }
    // Ограничение камеры
    void RestrictionCam()
    {
        Vector3 cl = transform.position;
        cl.x = Mathf.Clamp(cl.x, minCamX, maxCamX);
        cl.y = Mathf.Clamp(cl.y, minCamY, maxCamY);
        cl.z = Mathf.Clamp(cl.z, minCamZ, maxCamZ);
        transform.position = cl;
    }
}
READ ALSO
Помогите с алгоритмом решения задачи

Помогите с алгоритмом решения задачи

В таблице размером 3x3, проставлены в произвольном порядке цифры от 1 до 9Требуется последовательно обойти все элементы этой таблицы таким...

126
Как узнать координаты точки, в которую ткнул пользователь? C#

Как узнать координаты точки, в которую ткнул пользователь? C#

Мне нужно узнать координаты точки, на которую нажал пользователь на форме

115
Передача колонки из DataGridView в ComboBox

Передача колонки из DataGridView в ComboBox

Такой вопросЕсть 2 разные таблицы DataGridView, условно DG1 и DG2, находящиеся на разных формах и есть форма с полями и комбобоксом для добавления данных...

125