C# 如何创建光滑的地板效果
我正在制作一个简单的2D平台游戏,我的角色在冰冷的地面上滑倒和滑动时遇到了问题 创建2D物理材质可以与墙壁配合使用,但玩家在地面上时,即使摩擦力为0,也不会滑动,因此我尝试通过代码在没有物理材质的情况下进行创建C# 如何创建光滑的地板效果,c#,unity3d,C#,Unity3d,我正在制作一个简单的2D平台游戏,我的角色在冰冷的地面上滑倒和滑动时遇到了问题 创建2D物理材质可以与墙壁配合使用,但玩家在地面上时,即使摩擦力为0,也不会滑动,因此我尝试通过代码在没有物理材质的情况下进行创建 // Colliding with ICE void OnCollisionEnter2D(Collision2D col) { if (col.gameObject.tag == "ICE") { TouchingIce = true; } }
// 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;
}
}
(我知道检测结冰地面没有问题,因为我可以从检查员身上看到,触碰冰面的颜色会像预期的那样变为真或假。)
然后在更新中:
if (TouchingIce) {
iceMovement = true;
} else
{
iceMovement = false;
}
最后在fixedUpdate中:
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);
}
如果您需要查看我的代码的其余部分,请告诉我,我将发布其余部分。冰的诀窍是,因为它的摩擦力小得多,所以冰上的物体比正常地面上的物体更能保持动量,所以您希望操纵杆的运动与小加速度相关,而不是直接与速度相关 我想你可以保留一个变量,oldVelocity,来保持你当前的速度。然后每次更新时,只需在旧的速度中添加(move*maxSpeed*someSmallFactor),而不是将速度更改为与(move*maxSpeed)相等。调整一些小因子以适合您尝试模拟的运动
(当然,在此之后,你还必须做一些其他工作,限制你的最高速度,可能会增加摩擦力,在操纵杆居中时使玩家减速,等等)控制你速度的线是:
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
水平速度的100%由水平输入轴设置。
你需要一种不同的方法来处理这个问题
当TouchingIce为真时,你必须保持上次更新的速度,这意味着,如果玩家全速到达ice并释放控制,他们将以与上次更新相同的速度继续
然后将“移动”值视为加速度,而不是实际速度
试试这个:(伪代码)
你可能会发现你需要添加一些逻辑,当玩家跳过冰,因为你有空气转向 你可能想将此迁移到“谢谢你”,我实际上不知道有一个专门用于游戏开发的堆栈页面,我会确保将来我会发布到那里:)谢谢你的回复,我已经尝试添加力量,但他似乎以正常速度行走。。。我知道你说它只是一个伪代码,但你写它的方式是我将如何写它的真实,感谢你的回复,尽量减少你添加的力量。比如MaxSpeed*0.05f,应该可以。还要确保rb23D.Velcity没有被设置在其他任何地方。它会工作的。为了便于理解,请查看此unity Answers线程,使用addForce与velocity进行对比:在大多数平台中,您需要设置速度。但当你保持动量时,比如在冰上,你可能想使用力。对不起,我离开了一会儿,我使用了你的想法,发现速度是在其他地方设置的,正确的话,我现在终于得到了一个滑动运动,当玩家在冰上行走时,多亏了使用附加力。。。但是我发现玩家会突然停止一刻而不是继续,你知道有什么其他方法可以解决这个问题吗?顺便说一句,我的代码是如果(iceMovement&&TouchingIce){rb2d.AddForce(new Vector2(move*maxSpeed,0));}我看到您正在将运动的y分量设置为零。如果玩家缓慢地向后漂移,并且没有与冰物体碰撞,那么触碰冰将是错误的。或者第二台对撞机也可以将触碰冰设置为false。顺便说一句-如果这确实回答了原始问题,请单击回答上的“接受”。我在这里看到了您的逻辑,谢谢您的回答,我明白您的意思,但我如何将当前速度存储到变量中,然后在需要时添加到变量中,我所看到的教程仅显示了我编写代码的方式。它会不会像私人矢量2曲线;curVel=rb2d.velocity=newvector2(move*maxSpeed,rb2d.velocity.y)。。。。事实上,现在我已经写了,两个“=”符号init看起来非常错误。
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);
}