如何创建光滑的地板效果
How to create a slippery floor effect
我正在制作一个简单的 2D 平台游戏,我在让我的角色在结冰的地面上打滑时遇到问题。
创建 2D 物理 Material 适用于墙壁,但即使摩擦力为 0,播放器在地面上似乎也不会滑动,因此我尝试通过代码在没有物理的情况下完成此操作 Material.
// Colliding with ICE
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag == "ICE")
{
TouchingIce = true;
}
}
void OnCollisionStay2D(Collision2D col)
{
if (col.gameObject.tag == "ICE")
{
TouchingIce = true;
}
}
(我知道检测结冰地面没有问题,因为我可以在检查器中看到 TouchingIce Bool 按预期变为真和假。)
然后在更新中:
if (TouchingIce) {
iceMovement = true;
} else
{
iceMovement = false;
}
最后在固定更新中:
if (iceMovement)
{
// this is where I'm stuck
}
以下是当玩家在 fixedUpdate 中固定在正常地面上时我的移动方式
float move = Input.GetAxis("Horizontal"); // moving along horizontal Axis
anim.SetFloat ("Speed", Mathf.Abs (move));
if (grounded)
{
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
}
如果您需要查看我的其余代码,请告诉我,我会 post 其余的。
冰的诀窍是因为它的摩擦力低得多,它上面的物体比在正常地面上保持更好的动量,所以你希望操纵杆运动与小加速度相关,而不是直接与速度相关。
我怀疑您可以保留一个变量 oldVelocity 来保持当前速度。然后每次更新,而不是改变你的速度等于你的(move * maxSpeed),只需将(move * maxSpeed * someSmallFactor)添加到你的oldVelocity。调整 someSmallFactor 以适合您要模拟的运动。
(当然,在此之后您还必须做一些其他工作,限制您的最高速度,可能会增加摩擦力以在操纵杆居中时减慢播放器的速度等)
控制你速度的线是:
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
水平速度的 100% 由水平输入轴设置。
你需要一种不同的方式来处理这个。
当 TouchingIce 为真时,您必须保持上次更新的速度,这意味着,如果玩家全速前进,到达冰面并释放控制,他们将以与上次更新相同的速度继续。
然后将"move"值视为加速度而不是实际速度。
试试这个:(伪代码)
if(TouchingIce){
// Apply input as a force instead of setting velocity directly.
rb2d.AddForce(new Vector2 (move * maxSpeed, rb2d.velocity.y));
}else{
// Set Velocity Directly
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
}
您可能会发现您需要为玩家跳过冰面添加一些逻辑,因为您有空气转向功能。
我正在制作一个简单的 2D 平台游戏,我在让我的角色在结冰的地面上打滑时遇到问题。
创建 2D 物理 Material 适用于墙壁,但即使摩擦力为 0,播放器在地面上似乎也不会滑动,因此我尝试通过代码在没有物理的情况下完成此操作 Material.
// Colliding with ICE
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag == "ICE")
{
TouchingIce = true;
}
}
void OnCollisionStay2D(Collision2D col)
{
if (col.gameObject.tag == "ICE")
{
TouchingIce = true;
}
}
(我知道检测结冰地面没有问题,因为我可以在检查器中看到 TouchingIce Bool 按预期变为真和假。)
然后在更新中:
if (TouchingIce) {
iceMovement = true;
} else
{
iceMovement = false;
}
最后在固定更新中:
if (iceMovement)
{
// this is where I'm stuck
}
以下是当玩家在 fixedUpdate 中固定在正常地面上时我的移动方式
float move = Input.GetAxis("Horizontal"); // moving along horizontal Axis
anim.SetFloat ("Speed", Mathf.Abs (move));
if (grounded)
{
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
}
如果您需要查看我的其余代码,请告诉我,我会 post 其余的。
冰的诀窍是因为它的摩擦力低得多,它上面的物体比在正常地面上保持更好的动量,所以你希望操纵杆运动与小加速度相关,而不是直接与速度相关。
我怀疑您可以保留一个变量 oldVelocity 来保持当前速度。然后每次更新,而不是改变你的速度等于你的(move * maxSpeed),只需将(move * maxSpeed * someSmallFactor)添加到你的oldVelocity。调整 someSmallFactor 以适合您要模拟的运动。
(当然,在此之后您还必须做一些其他工作,限制您的最高速度,可能会增加摩擦力以在操纵杆居中时减慢播放器的速度等)
控制你速度的线是:
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
水平速度的 100% 由水平输入轴设置。 你需要一种不同的方式来处理这个。
当 TouchingIce 为真时,您必须保持上次更新的速度,这意味着,如果玩家全速前进,到达冰面并释放控制,他们将以与上次更新相同的速度继续。
然后将"move"值视为加速度而不是实际速度。
试试这个:(伪代码)
if(TouchingIce){
// Apply input as a force instead of setting velocity directly.
rb2d.AddForce(new Vector2 (move * maxSpeed, rb2d.velocity.y));
}else{
// Set Velocity Directly
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
}
您可能会发现您需要为玩家跳过冰面添加一些逻辑,因为您有空气转向功能。