【问题标题】:How to make camera relative movement如何使相机相对运动
【发布时间】:2019-04-14 06:52:33
【问题描述】:

我正在学习 unity 和 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);
         } 
    }
}

玩家的运动是世界相对的,如何让运动相机相对?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    如果要相对于gameObject 进行移动,请在要旋转的gameObject 的变换上调用Transform.Rotate() 方法,而不是直接修改其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);
         }
    

    【讨论】:

    • 怎么样? (正如我所说,我是 c# 和统一脚本的新手)
    【解决方案2】:

    一般来说,您不想直接弄乱对象 transform.rotation,至少不会,除非您至少有点了解四元数(我不知道!)。

    我可以看到您的代码存在一些问题,但共同点似乎是您并不真正了解转换的工作原理。具体来说,您可能想要查看 World/Local 空间。

    控制玩家的常用方法大致如下:

    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 tuts 大量 不错的教程,包括视频教程,所以对于这样的内容,您只需搜索 <game type> tutorial 并选择您认为好的内容.在开始时,我建议您避免使用最短的视频,因为您可能会从只适合较长视频的解释中受益匪浅。当然,这也不意味着您应该选择最长的视频。

    【讨论】:

      【解决方案3】:

      如果有人需要移动对象并且不关心碰撞器,您可以使用 transform.Translate 并将您的相机(或任何变换)分配给他的第二个参数 relativeTo 以自动计算相对于指定对象的平移。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 2017-09-21
        • 2014-07-15
        相关资源
        最近更新 更多