我想限制球员在球体内的移动,原理图如下所示。如果玩家移动超出范围,则将玩家限制为球体最大半径范围。
如何编写C#代码来实现它,像这样?
这是我目前的步骤:
创建3D球体
创建C#代码追加到球体对象
到目前为止我的代码:
public Transform player;
void update(){
Vector3 pos = player.position;
}
答案 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建议的是正确的,但也包括你赢得无法滑动的事实。如果您的运动矢量甚至略微超出球体范围,则在球体边界上:
(抱歉蹩脚的图形技能......)
如果你想能够滑动&#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()
的示例中)。