Вопросы, возникающие из кода контроллера от первого лица в Unity - PullRequest
0 голосов
/ 27 декабря 2018

Я создаю контроллер от первого лица в Unity.Очень простая штука, камера - дитя капсулы Player.Коды работают, но мне нужна помощь, чтобы объяснить, что происходит.

first person controller

* камера является дочерним элементом Player в иерархии

hierarchy

Вот мои вопросы:

  1. Почему в PlayerMovement мы переводим по оси Z, чтобы добиться вертикального перемещения, когда Unity находится по оси Y-Up?

  2. В CamRotation я понятия не имею, что происходит в Update().Почему мы применяем горизонтальное движение к нашему проигрывателю, а затем вертикальное движение к нашей камере?Почему он не применяется к тому же GameObject?

  3. Чего добивается MouseMove?Почему мы используем var?

  4. Я думаю, что мы получаем значение того, сколько мыши было перемещено, но что тогда делает с ним применение Vector2.Scale?

Код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour {

    public float speed = 5.0f;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        float mvX = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
        float mvZ = Input.GetAxis("Vertical") * Time.deltaTime * speed;
        transform.Translate(mvX, 0, mvZ);
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CamRotation : MonoBehaviour {

    public float horizontal_speed = 3.0F;
    public float vertical_speed = 2.0F;
    GameObject character;  // refers to the parent object the camera is attached to (our Player capsule)

    // initialization
    void Start()
    {
        character = this.transform.parent.gameObject;
    }

    // Update is called once per frame
    void Update()
    {
        var mouseMove = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
        mouseMove = Vector2.Scale(mouseMove, new Vector2(horizontal_speed, vertical_speed));

        character.transform.Rotate(0, mouseMove.x, 0); // to rotate our character horizontally
        transform.Rotate(-mouseMove.y, 0, 0);  // to rotate the camera vertically
    }
}

1 Ответ

0 голосов
/ 27 декабря 2018
  1. XY - это плоскость для 2D игр Unity.Для 3D у вас есть ось Z для высоты и плоскость XY для позиционирования.

  2. Обратите внимание, что применяются различные компоненты из mouseMove (.x для character и .y для camera).Это означает, что движение от персонажа не равно движению от камеры;один должен быть быстрее / медленнее другого.

  3. var - это предопределенное ключевое слово C #, которое позволяет компилятору определить подходящий тип.В этом случае это так же, как если бы вы написали Vector2, как в Vector2 mouseMove = new Vector2(...);.

  4. Вы масштабируете значение с mouseMove, умножая его компоненты на предопределенные значенияв вашем коде.Вот и все.

РЕДАКТИРОВАТЬ

Вы применяете .x к своему персонажу, потому что, как вы прокомментировали после строки кода, вы хотитепереместить его по горизонтали .Что касается камеры, .y применяется, потому что вы хотите переместить ее по вертикали .Отрицательное значение может быть из-за того, что ось инвертирована, поэтому вы делаете ее отрицательной, чтобы камера имела естественное движение.Это тот же принцип, который есть в некоторых играх, когда они позволяют инвертировать ось Y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...