Как сделать движение камеры относительно - PullRequest
0 голосов
/ 14 апреля 2019

Я изучаю единство и c #, и хочу сделать свое движение относительным движением камеры вместо мирового относительного движения.Как мне это сделать?

Я изучаю Unity и C #, моя версия Unity - 2018.3.12f1.Я был бы рад за помощь.

просто чтобы сообщить, вместо того, чтобы перемещать камеру, я вращаю игрока.

    void Update()
    {

     float AxisY = Player.transform.eulerAngles.y;  
    /* Movement starts here */

     Vector3 Movement = new Vector3 (Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

     if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) { //running code
        Player.transform.position += Movement * running_speed * Time.deltaTime;
     } else {
        Player.transform.position += Movement * speed * Time.deltaTime;
     }

     /*Movement ends here */

     /* Rotation controller starts here */

     Quaternion target = Quaternion.Euler(Player.transform.eulerAngles.x, Player.transform.eulerAngles.y, Player.transform.eulerAngles.z);

      /*if (Player.transform.eulerAngles.x != 0 || Player.transform.eulerAngles.z != 0 || Player.transform.eulerAngles.y != 0) {
               Player.transform.rotation = Quaternion.Euler(0,0,0);
         }*/

      if (Input.GetKey(KeyCode.E))
         {
            Debug.Log("E got pressed");
            //float AxisYPositive = Player.transform.eulerAngles.y;
            AxisY = AxisY+1;
            Player.transform.rotation = Quaternion.Euler(0, AxisY, 0);

         } else if (Input.GetKey(KeyCode.Q)) 
         {
            Debug.Log("Q got pressed");
            //float AxisYNegetive = Player.transform.eulerAngles.y;
            AxisY=AxisY-1;
            Player.transform.rotation = Quaternion.Euler(0, AxisY, 0);
         } 
    }
}

Движение игрока относительно мира, как сделатьдвижение камеры относительно?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Как правило, вы не хотите напрямую связываться с объектами transform.rotation, по крайней мере, если вы хотя бы немного не понимаете кватернионы (я не знаю!).

Я вижу некоторые проблемы с вашим кодом, но, как представляется, общая нить заключается в том, что вы не совсем понимаете, как работают преобразования. В частности, вы можете захотеть заглянуть в мир / локальное пространство.

Обычный способ управления игроком выглядит примерно так:

void DoMovement(Transform player)
{
  //If you move first your controls might feel 'drifty', especially at low FPS.
  Turn(player);
  Move(player);
}

void Turn(Transform player)
{
  float yaw = Input.GetAxis("Yaw") * time.deltaTime; //Aka turn left/right
  player.Rotate(0, yaw, 0, Space.Self); 
  // Space.Self is the default value, but I put it here for clarity.
  //That means the player will rotate relative to themselves, 
  //...instead of relative to the world-axis, like in your code.
}

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

Transform _cameraTransform; //Assumes this is set druing Start()

void Move(Transform player)
{
  var forwardMove = _cameraTransform.Forward; //Get whatever direction is 'forward' for camera
  forwardMove.Y = 0; //Don't want movement up and down. 
  forwardMove = forwardMove.normalized; //Normalize sets the 'power' of the vector to 1.
  //If you set Y to 0 and don't normalize you'll go slower when camera looks down 
  //...than when camera is flat along the plane

  player.position += forwardMove * Input.GetAxis("Vertical") * time.deltaTime;

  //Here you could do the same for strafe/side to side movement.
  //Would be same as above, but using the transform.right and Horizontal axis
}

Теперь я делаю некоторые предположения, поскольку вы не указали, что это за игра и какие элементы управления вам нужны. Я предполагаю, что у вас есть персонаж, бегающий по большей части на плоской плоскости (без управления самолетом / космическим кораблем), и что камера прикреплена к игроку. На самом деле это не так.

В любом случае я советую вам ознакомиться с учебными пособиями , особенно с учебным пособием по керлингу, которое, как я обнаружил, полезно для начинающих, чтобы понять основные элементы управления игроками, которые не являются просто миром. -родственник. Другие уроки тоже очень хороши, если вы думаете, что они интересны.

Помимо официального Unity выпускает тонну от неплохих до удивительных уроков, включая видеоуроки, так что для чего-то подобного вы можете просто найти <game type> tutorial и выбрать то, что вам нравится. Приступая к работе, я советую вам избегать самых коротких видеороликов, так как вы, вероятно, очень выиграете от объяснения, которое подходит только для более длинных видео. Конечно, это не значит, что вы должны выбирать самые длинные видео.

0 голосов
/ 14 апреля 2019

Если вы хотите сделать движения относительно gameObject, вызовите метод Transform.Rotate() для преобразования gameObject, которое вы хотите повернуть, вместо непосредственного изменения Quaternion. Просто убедитесь, что последний аргумент установлен на Space.Self.

if (Input.GetKey(KeyCode.E))
     {
        Debug.Log("E got pressed");
        //float AxisYPositive = Player.transform.eulerAngles.y;
        AxisY = AxisY+1;
        Player.transform.Rotate(Quaternion.Euler(0, AxisY, 0), Space.Self);
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...