检测两个物体之间的碰撞
Detect collisions between 2 objects
我正在尝试使用 Unity 在移动设备上做一个小游戏,但我遇到了迷宫旋转的问题。
要添加上下文:
当您在屏幕上移动手指时,迷宫会自行旋转。里面有一个球,你需要让它进入一个格子才能赢得关卡。
当迷宫旋转太快时,小球掉落穿过地面,我不知道如何解决。
我试着玩重力,对撞机......
小球在跳跃时(迷宫快速上下移动时)也是如此。
目前我只是在你下落时重置球的位置。
{
ball.transform.position = new Vector3(0, 2, 0);
maze.transform.position = Vector3.zero;
maze.transform.rotation = Quaternion.identity;
}
你们有什么想法吗?谢谢
在刚体(对于球)中,将碰撞检测设置为连续,并在迷宫(如果有的话)的刚体中将碰撞检测设置为连续动态。希望这对您有所帮助!
如果允许玩家自由移动平台,我认为这是不可避免的。我建议你限制玩家倾斜平台的速度。这样,小球就会有更多的帧数来适应新的坡度
我在倾斜迷宫中遇到了类似的问题 mini-game 我曾经研究过。理想情况下,实施 会起作用,但我认为迷宫移动得太快以至于碰撞无法正确注册。您需要使用 Lerp 平滑迷宫的旋转。在我们的例子中,我们有一个带有倾斜值的压力板,所以它不会直接转化为您的移动使用,但可能会给您一个正确方向的推动。我们使用了:
public GameObject maze;
private float _lerpTime;
private bool _isRotating;
private Quaternion _startingRot, _desiredRot;
private void Awake()
{
_startingRot = maze.transform.localRotation;
}
private void Update()
{
//Don't want to move the maze if we don't ask for it
if(!_isRotating)
return;
//Lerp the maze's rotation
_lerpTime = Mathf.Clamp(_lerpTime + Time.deltaTime * 0.5f, 0f, 1f);
maze.transform.localRotation = Quaternion.Lerp(_startingRot, _desiredRot, _lerpTime);
//Once the maze gets where it needs to be, stop moving it
if(affectedObject.transform.localRotation.Equals(_desiredRot)
_isRotating = false;
}
private void ActivateTilt()
{
//Set the new starting point of the rotation.
_startingRot = maze.transform.localRotation;
//However you want to calculate the desired rotation here
//Reset our lerp and start rotating again
_lerpTime = 0f;
_isRotating = true;
}
随着时间的推移,这将减轻迷宫的旋转。使小球能够适应新的对撞机位置。
我正在尝试使用 Unity 在移动设备上做一个小游戏,但我遇到了迷宫旋转的问题。
要添加上下文: 当您在屏幕上移动手指时,迷宫会自行旋转。里面有一个球,你需要让它进入一个格子才能赢得关卡。
当迷宫旋转太快时,小球掉落穿过地面,我不知道如何解决。 我试着玩重力,对撞机...... 小球在跳跃时(迷宫快速上下移动时)也是如此。
目前我只是在你下落时重置球的位置。
{
ball.transform.position = new Vector3(0, 2, 0);
maze.transform.position = Vector3.zero;
maze.transform.rotation = Quaternion.identity;
}
你们有什么想法吗?谢谢
在刚体(对于球)中,将碰撞检测设置为连续,并在迷宫(如果有的话)的刚体中将碰撞检测设置为连续动态。希望这对您有所帮助!
如果允许玩家自由移动平台,我认为这是不可避免的。我建议你限制玩家倾斜平台的速度。这样,小球就会有更多的帧数来适应新的坡度
我在倾斜迷宫中遇到了类似的问题 mini-game 我曾经研究过。理想情况下,实施
public GameObject maze;
private float _lerpTime;
private bool _isRotating;
private Quaternion _startingRot, _desiredRot;
private void Awake()
{
_startingRot = maze.transform.localRotation;
}
private void Update()
{
//Don't want to move the maze if we don't ask for it
if(!_isRotating)
return;
//Lerp the maze's rotation
_lerpTime = Mathf.Clamp(_lerpTime + Time.deltaTime * 0.5f, 0f, 1f);
maze.transform.localRotation = Quaternion.Lerp(_startingRot, _desiredRot, _lerpTime);
//Once the maze gets where it needs to be, stop moving it
if(affectedObject.transform.localRotation.Equals(_desiredRot)
_isRotating = false;
}
private void ActivateTilt()
{
//Set the new starting point of the rotation.
_startingRot = maze.transform.localRotation;
//However you want to calculate the desired rotation here
//Reset our lerp and start rotating again
_lerpTime = 0f;
_isRotating = true;
}
随着时间的推移,这将减轻迷宫的旋转。使小球能够适应新的对撞机位置。