在球体内设置球员的边界

时间:2017-01-10 07:08:52

标签: c# unity3d boundary

我想限制球员在球体内的移动,原理图如下所示。如果玩家移动超出范围,则将玩家限制为球体最大半径范围。

如何编写C#代码来实现它,像这样?

The player is at the center of a circle with a radius of 0.5. Anything beyond the circumference of the circle is out of bounds.

这是我目前的步骤:

  1. 创建3D球体

  2. 创建C#代码追加到球体对象

  3. 到目前为止我的代码:

    public Transform player;
    
    void update(){
          Vector3 pos = player.position;
    }
    

2 个答案:

答案 0 :(得分:3)

我不知道你如何计算你的球员的位置,但在将新位置分配给球员之前,你应该检查一下,看看这一举动是否合格 从球体的中心检查新的位置距离

//so calculate your player`s position 
//before moving it then assign it to a variable named NewPosition
//then we check and see if we can make this move then we make it
//this way you don't have to make your player suddenly stop or move it 
//back to the bounds manually          

if( Vector3.Distance(sphereGameObject.transform.position, NewPosition)< radius)
{
 //player is in bounds and clear to move
 SetThePlayerNewPosition();
}

答案 1 :(得分:1)

@Milad建议的是正确的,但也包括你赢得无法滑动的事实。如果您的运动矢量甚至略微超出球体范围,则在球体边界上:

Sphere vector explanation

(抱歉蹩脚的图形技能......)

如果你想能够滑动&#34;你能做什么?在球体内部表面上获得玩家位置和X矢量之间形成的角度,然后将此角度应用于:

public Transform player;
public float sphereRadius;

void LateUpdate()
{
    Vector3 pos = player.position;
    float angle = Mathf.Atan2(pos.y, pos.x);
    float distance = Mathf.Clamp(pos.magnitude, 0.0f, sphereRadius);
    pos.x = Mathf.Cos(angle) * distance;
    pos.y = Mathf.Sin(angle) * distance;
    player.position = pos;
}

请确保使用这个不会影响你的玩家移动脚本(这就是为什么我把它放在LateUpdate()的示例中)。