会潜水的小火龙 2024-03-11 09:40 采纳率: 44.4%
浏览 8
已结题

unity2d坦克顶墙移动炮台飞走问题

unity摇杆用的joystick Pack插件
下面是坦克炮台旋转代码,右摇杆控制旋转,炮台单独一页代码

    private void FixedUpdate()
    {
 Vector3 lookVec2 = new Vector3(joystick.Horizontal,
       joystick.Vertical, 4000);
       if (joystick.Horizontal != 0 && joystick.Vertical != 0)
       {
            transform.rotation = Quaternion.LookRotation(lookVec2, Vector3.forward);
        }
    }

坦克移动用的代码,左摇杆控制底座移动,底座单独一页代码

       Vector2 moveVec = new Vector2(joystick.Horizontal,
joystick.Vertical);
transform.Translate(moveVec * Time.fixedDeltaTime * speed, Space.World);

坦克炮台是坦克的子物体
坦克顶墙的时候摇杆坐标joystick.Horizontal和joystick.Vertical还是不停输出的,然后坦克炮台就脱离坦克底座移动了
用什么设置或者代码能解决这个问题?

  • 写回答

3条回答 默认 最新

  • 关注

    回答引自Claude3
    遇到的问题是因为在坦克顶墙的时候,坦克底座无法移动,但是坦克炮台仍然会根据摇杆输入进行旋转,导致了炮台与底座脱离的情况。为了解决这个问题,您可以考虑在坦克底座无法移动时,禁止坦克炮台进行旋转。
    可以尝试以下方法:

    1.在FixedUpdate中先判断坦克底座是否能够移动,如果不能移动,则不进行炮台旋转:

    private void FixedUpdate()
    {
        Vector2 moveVec = new Vector2(joystick.Horizontal, joystick.Vertical);
        bool canMove = CanTankMove(moveVec); // 判断坦克是否能够移动
    
        if (canMove)
        {
            transform.Translate(moveVec * Time.fixedDeltaTime * speed, Space.World);
    
            Vector3 lookVec2 = new Vector3(joystick.Horizontal, joystick.Vertical, 4000);
            if (joystick.Horizontal != 0 && joystick.Vertical != 0)
            {
                transform.rotation = Quaternion.LookRotation(lookVec2, Vector3.forward);
            }
        }
    }
    
    private bool CanTankMove(Vector2 moveVec)
    {
        // 在这里编写判断坦克是否能够移动的逻辑
        // 例如使用射线检测或者其他方法判断前方是否有障碍物
        return true; // 暂时返回true,表示可以移动
    }
    

    2.另一种方法是在每次FixedUpdate中重置炮台的旋转,如果坦克底座无法移动,则不进行炮台旋转:

    private void FixedUpdate()
    {
        Vector2 moveVec = new Vector2(joystick.Horizontal, joystick.Vertical);
        bool canMove = CanTankMove(moveVec); // 判断坦克是否能够移动
    
        if (canMove)
        {
            transform.Translate(moveVec * Time.fixedDeltaTime * speed, Space.World);
        }
        else
        {
            // 重置炮台旋转
            transform.rotation = Quaternion.identity;
        }
    
        Vector3 lookVec2 = new Vector3(joystick.Horizontal, joystick.Vertical, 4000);
        if (joystick.Horizontal != 0 && joystick.Vertical != 0 && canMove)
        {
            transform.rotation = Quaternion.LookRotation(lookVec2, Vector3.forward);
        }
    }
    

    在这种方法中,每次FixedUpdate中先判断坦克是否能够移动,如果不能移动,则重置炮台的旋转。然后再根据摇杆输入和坦克是否能够移动的条件来决定是否旋转炮台。
    无论使用哪种方法,关键点都是在坦克无法移动时禁止炮台进行旋转。需要根据具体的游戏逻辑来实现CanTankMove函数,判断坦克是否能够移动。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月22日
  • 修改了问题 3月12日
  • 创建了问题 3月11日