Unity3D技术之利用角色控制器实现爬坡减速效果

本文介绍如何在Unity3D中使用勾股定理调整角色控制器组件,实现角色上坡时自动减慢速度的功能。通过计算斜边与高差之间的关系,动态调整移动距离,使游戏角色的动作更加真实。

 欢迎来到狗刨学习网,这里有很多U3D资源U3D培训视频U3D常见问题U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌 

 

       按照正常情况游戏中角色在上坡爬坡的时候速度应该减慢,可是角色控制器组件没有帮我们做这个判断,刚好最近工作中需要做这个功能,我就用勾股定理的法则来 解决这个问题。如下图所示,当角色在爬坡的时候,角色控制器默认行走的距离就是 “C” 。但是如果行走的距离是“C” 你会发现上坡的速度太快了。这里我们需要计算”b”,让角色在上坡时候一次移动的距离是”b”这样移动就很正常了,文章出处【狗刨学习网】。 

 

       按照勾股定理的法则, c二次方 = a二次方 + b二次方。已知 c  和 我们求的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坐标的插值也可以判断。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值