Unity: выделите «увеличить», чтобы указать - PullRequest
0 голосов
/ 28 ноября 2018

Мое приложение (с использованием Unity 2017.3.1f1) настроено так:

  • Перспективная камера находится внутри объекта player (столкновения отключены), а такжеего потомок (чтобы получить вид от первого лица)
  • В камере есть скрипт «MouseLook» (я изменил несколько вещей в стандартном Unity), который держит курсор заблокированным и скрытым в середине экрана(Cursor.lockState = CursorLockMode.Locked & Cursor.visible = false)
  • У «игрока» есть общий сценарий «ввода» и сценарий движения: при нажатии кнопки «wasd» эти клавиши перемещают объект игрока, что также заставляет камеру двигаться

Чего я хочу достичь:

  • Используйте колесо прокрутки мыши, чтобы перемещаться в направлении точки, на которую смотрит камера, или от нее.это, независимо, если есть объект.
  • Я не хочу менять FOV / scale
  • Не нужно использовать Lerp, я просто хочу переместить игрока на шаг кцелевое положение каждый кадр, в котором используется колесо мыши

Что я пробовал:

1a.В общем сценарии ввода:

if(Input.GetAxis("Mouse ScrollWheel") != 0) {
    transform.Translate(0,0,Input.GetAxis("Mouse ScrollWheel") * 200);
}

1b: В общем сценарии ввода:

if(Input.GetAxis("Mouse ScrollWheel") != 0) {
    transform.position += transform.forward * Input.GetAxis("Mouse ScrollWheel") * 200;
}

Оба работают одинаково, но только перемещают игрока/ Камера на том же уровне у, даже если смотреть вниз / вверх.transform.up всегда выводит «(0.0, 1.0, 0.0)», так что нет смысла включать это.

2.Новый скрипт на камере ( source ):

public class ScrollToZoom : MonoBehaviour {
    public GameObject player;

    void Update () {
        if(Input.GetAxis("Mouse ScrollWheel") != 0) {
            RaycastHit hit;
            Ray ray = this.transform.GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
            Vector3 desiredPosition;

            if(Physics.Raycast(ray,out hit)) {
                desiredPosition = hit.point;
            } else {
                desiredPosition = transform.position;
            }
            float distance = Vector3.Distance(desiredPosition,transform.position);
            Vector3 direction = Vector3.Normalize(desiredPosition - transform.position) * (distance * Input.GetAxis("Mouse ScrollWheel"));

            transform.position += direction;
        }
    }
}

Это не работает вообще, потому что «направление» всегда (0,0,0), потому что курсор мыши заблокирован (что я не могу / не буду менять).

Как включить в это вращение вокруг оси x (я зажимаю его на +/- 90 ° в скрипте "MouseLook")?

1 Ответ

0 голосов
/ 28 ноября 2018
if(Input.GetAxis("Mouse ScrollWheel") != 0) {
    transform.localPosition += Vector3.forward * Input.GetAxis("Mouse ScrollWheel") * 200;
}

Должно работать.transform.position будет указывать на мировую позицию независимо от того, куда объект направлен.

...