【问题标题】:raycast used to prevent camera from going through ceiling and floor making player stuck Unityraycast 用于防止摄像机穿过天花板和地板使玩家卡住 Unity
【发布时间】:2020-07-26 07:14:58
【问题描述】:

我有一个项目,用户可以控制相机,就像在 Unity 的场景编辑器中控制相机一样。我正在使用光线投射来防止相机穿过墙壁、地板和天花板。它的工作方式是我在一定范围内发送光线投射,如果没有命中,则转换将正常发生,但在检测到命中时不会发生。我正在使用这种方法来左右平移,它非常适合阻止玩家穿过墙壁。我也使用同样的方法进行鼠标滚轮缩放,它也很完美。当用户使用垂直平移时,当我使用此方法阻止用户穿过天花板或地板时,就会出现问题。用户有时会卡在天花板或地板上,我不知道为什么。我尝试了很多不同的方法来解决这个问题,但没有成功。如果有人知道为什么会发生这种情况以及可能的解决方法,我将不胜感激。这是我使用光线投射进行垂直平移的代码。

   //if the user moves the camera veritcally
   if (verticalTranslation.isActivated())
   {
            float translateY = Input.GetAxis(mouseVerticalAxisName) * verticalTranslation.sensitivity;
            RaycastHit hit;
            //sends raycast up veritcally
            if (translateY > 0)
            {
                //if raycast hit detected do nothing, else transform position 
                if (Physics.Raycast(transform.position, Vector3.up, out hit, maxDistance))
                {
                    Debug.LogWarning("stop movement");
                    Debug.LogWarning(hit.distance);
                }
                else
                {
                    transform.Translate(0, translateY, 0);
                }
            }
            //sends raycast down veritcally
            if (translateY < 0)
            {
                if (Physics.Raycast(transform.position, -Vector3.up, out hit, maxDistance))
                {
                    Debug.LogWarning("stop movement");
                    Debug.LogWarning(hit.distance);
                }
                else
                {
                    transform.Translate(0, translateY, 0);
                }
            }
    }

【问题讨论】:

  • 我只是在想你是否对 translateY == 0 的情况感兴趣。
  • 这实际上是一个很好的观点,我真的很高兴你提出了这一点

标签: c# unity3d raycasting


【解决方案1】:

如果其他人遇到类似问题,Gintas 提出了一个很好的观点,我按照他的建议提出了 translateY == 0 的案例。这已经解决了这个问题。这是新代码。

   if (verticalTranslation.isActivated())
   {
            position = transform.position;
            float translateY = Input.GetAxis(mouseVerticalAxisName) * verticalTranslation.sensitivity;

            if (position.y < 12284)
            {
                position.y = 12284;
                transform.position = position;
            }

            RaycastHit hit;
            if (translateY > 0)
            {

            if (Physics.SphereCast(origin, sphereRadius, Vector3.up, out hit, maxDistance, layerMask, QueryTriggerInteraction.UseGlobal))
            {
                Debug.LogWarning("stop movement");
                Debug.LogWarning(hit.distance);
                }
                else
                {
                    transform.Translate(0, translateY, 0);
                }
            }
            if (translateY < 0)
            {
            if (Physics.SphereCast(origin, sphereRadius, -Vector3.up, out hit, maxDistance, layerMask, QueryTriggerInteraction.UseGlobal))
            {
                Debug.LogWarning("stop movement");
                    Debug.LogWarning(hit.distance);
                }
                else
                {
                    transform.Translate(0, translateY, 0);
                }
            }
            if(translateY == 0)
            {
                transform.Translate(0, translateY, 0);
            }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多