“C” 。但是如果行走的距离是“C” 你会发现上坡的速度太快了。这里我们需要计算”b”,让角色在上坡时候一次移动的距离是”b”这样移动就很正常了


按照勾股定理的法则, c二次方 = a二次方 + b二次方。已知 c  和 a 我们求的b的距离即可。

 

第一步:主角目前所在地形的3D坐标,以及主角面朝方向行走“一段距离”后的3D坐标。 “一段距离” 我这里使用他的行走速度也就是1秒行走的长度。

 

第二步:把部分代码添加入角色控制器组件。默认角色控制器行走是走路,简单改一下让他跑步。找UpdateSmoothedMovementDirection ()方法,加入“|isMoving” 这个判断条件。

if (Input.GetKey (KeyCode.LeftShift) | Input.GetKey (KeyCode.RightShift) | isMoving) 

 

然后找到Update()方法,(C#和js都可以编译通过下面这段代码)

// Apply jumping logic 
ApplyJumping (); 
//-------------开始插入代码 ------------- 
//当主角处于移动状态时开始计算主角目前坐标以及1秒后坐标 
if(IsMoving()) 
{ 
//得到主角行走1秒后所在位置地形的坐标 
var newPos = transform.position + (transform.rotation * Vector3.forward * moveSpeed); 
newPos.y = Terrain.activeTerrain.SampleHeight(newPos); 
//得到主角当前位置所在地形的坐标 
var heropos = transform.position; 
heropos.y = Terrain.activeTerrain.SampleHeight(transform.position); 
//绘制一条Debug的线段,在编辑器中看的更清楚。 
Debug.DrawLine(heropos,newPos,Color.red); 
//斜边的长度 
var c = moveSpeed; 
//短直角边的长度 
var b = newPos.y - heropos.y; 
//b >0 标示主角在爬坡 b < 0 表示主角在下坡 
if(b > 0) 
{ 
// 根据公式计算 a = 根号下 c二次方 -  b二次方 
var a = Mathf.Sqrt(Mathf.Pow(c,2) - Mathf.Pow(b,2)); 
moveSpeed = a; 
} 
} 
//-------------结束插入代码 ------------- 
// Calculate actual motion 
Vector3 movement = moveDirection * moveSpeed + new Vector3 (0, verticalSpeed, 0) + inAirVelocity; 
movement *= Time.deltaTime;

 

直接运行游戏,你会发现当你在爬坡的时候主角的移动速度会减少,下坡与平地的时候移动速度正常。

 

另外还有一个地方需要注意下。 使用角色控制器时如果你的坡度角度过于大,你会发现你的主角无法继续爬坡。如下图所示,默认坡度角度为45。如果你需要爬坡更高的角度,直接修改Slope Limit数值即可。

 

当然代码中我们也可以控制角色是否可以继续爬坡,根据上述代码两点Y坐标的插值也可以判断。