如何使相机相对运动

时间:2019-04-14 06:52:33

标签: c# unity3d

我正在学习unity和c#,并且希望使我的动作成为相对于相机的动作,而不是与世界相对的动作。我该怎么办?

我正在学习unity和c#,我的版本是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 :(得分:0)

如果要相对于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);
     }

答案 1 :(得分:0)

通常,您不想直接弄乱对象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
}

现在,我在这里做一些假设,因为您尚未指定游戏类型和所需的控件。我假设您有一个人物在一个几乎是平面的飞机上跑来跑去(没有飞机/飞船控件),并且相机已连接到播放器。事实并非如此。

无论如何,我建议您查看tutorials,尤其是我发现的滚球教程非常适合初学者,以帮助他们掌握与世界无关的基本玩家控件。如果您认为其他教程很有趣,那么它们也非常不错。

除了Unity官方提供的很多 ton 不错的教程之外,包括视频教程,因此对于类似的内容,您可以搜索<game type> tutorial并选择看起来不错的东西给你。在开始使用时,我建议您避免使用最短的视频,因为仅适用于较长视频的说明可能会大大受益。当然,这并不意味着您也应该选择最长的视频。