Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建光滑的地板效果_C#_Unity3d - Fatal编程技术网

C# 如何创建光滑的地板效果

C# 如何创建光滑的地板效果,c#,unity3d,C#,Unity3d,我正在制作一个简单的2D平台游戏,我的角色在冰冷的地面上滑倒和滑动时遇到了问题 创建2D物理材质可以与墙壁配合使用,但玩家在地面上时,即使摩擦力为0,也不会滑动,因此我尝试通过代码在没有物理材质的情况下进行创建 // Colliding with ICE void OnCollisionEnter2D(Collision2D col) { if (col.gameObject.tag == "ICE") { TouchingIce = true; } }

我正在制作一个简单的2D平台游戏,我的角色在冰冷的地面上滑倒和滑动时遇到了问题

创建2D物理材质可以与墙壁配合使用,但玩家在地面上时,即使摩擦力为0,也不会滑动,因此我尝试通过代码在没有物理材质的情况下进行创建

// 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);
}