按照正常情况游戏中角色在上坡爬坡的时候速度应该减慢,可是角色控制器组件没有帮我们做这个判断,刚好最近工作中需要做这个功能,

我就用勾股定理的法则来解决这个问题。如下图所示,当角色在爬坡的时候,角色控制器默认行走的距离就是 “C” 。但是如果行走的距离是“C”

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

按照勾股定理的法则, c二次方 = a二次方 +

b二次方。已知 c  和 a 我们求的b的距离即可。

第一步:主角目前所在地形的3D坐标,以及主角面朝方向行走“一段距离”后的3D坐标。 “一段距离”

我这里使用他的行走速度也就是1秒行走的长度。

第二步:把部分代码添加入角色控制器组件。

默认角色控制器行走是走路,简单改一下让他跑步。找到UpdateSmoothedMovementDirection

()方法,加入“|isMoving” 这个判断条件。

1

if (Input.GetKey

(KeyCode.LeftShift)

| Input.GetKey (KeyCode.RightShift)

| isMoving)

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

// 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坐标的插值也可以判断。

1

float xx

= newPos.y - heropos.y;

接着,如果你的项目中没有使用地形元素,而是用美术建模形成的地形话,那么就需要通过射线来取得“地形”上的两个点。如下图所示。

白色射线:得到主角面朝方向一步以后的地形坐标。

蓝色线段:主角移动的起点和终点的线段。

红色射线:处理摄像机(与本章无关)

在地形之上,我们使用下面这个方法得到地形的高度。

1

Terrain.activeTerrain.SampleHeight()

如果项目中的地形是美术做的话,需要用射线的方式来计算。代码比较简单我就不用注释了,

就是上图中的那个白色射线,从天上射向地面。参数是模型面前下一步的将要行走的坐标,然后通过射线换算成实际Y轴高度。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public static float

SampleHeight(Vector3

point)

{

var

sample = point;

sample.y += 20;

Ray ray

= new

Ray(sample,

Vector3.down);

RaycastHit hit;

if (Physics.Raycast(ray, out

hit))

{

if(hit.collider.gameObject.tag != "Terrain")

{

Debug.DrawLine(sample,hit.point);

return hit.point.y;

}

}

return -1;

}

剩下的地方就和上面的代码差不多了。如果你的项目中没有使用角色控制器,用别的方式来实现移动效果,也可以使用这样的方法,总是就是勾股定理了。

unity3d鸿蒙系统支持,Unity3D之处理角色控制器实现上坡爬坡减速相关推荐

  1. 鸿蒙系统怎么支持安卓应用,鸿蒙系统支持安卓软件吗-鸿蒙系统支持安卓应用吗...

    华为鸿蒙的正式推送,也是让很多朋友们感到高兴的,作为自研系统,华为鸿蒙受到了很多的关注,关于华为鸿蒙的系统流畅度和实际体验上,其实也是非常惊喜的,流畅度得到了提升,性能表现也不错,为大家带来鸿蒙系统和 ...

  2. 支持鸿蒙的手机型号多少钱,华为鸿蒙系统支持手机型号一览

    随着华为鸿蒙系统即将推出,大家也愈发的关注.据悉华为鸿蒙系统是支持第三方手机厂商使用的,因此不少用户也考虑届时尝试用看看.那么,鸿蒙系统支持哪些手机呢?像国产手机小米.OPPO等能不能使用?下面一起来 ...

  3. 手机适配鸿蒙教程,鸿蒙系统支持手机介绍

    最近华为自研发的全新操作系统鸿蒙2.0正在如火如荼地进行公测,很多朋友使用过后多觉得非常不错.于是就有其他品牌手机的用户来问自己能不能也使用鸿蒙系统.小编今天就带大家看看哪些手机可以使用鸿蒙系统. 鸿 ...

  4. 小米手机能用上鸿蒙吗,鸿蒙系统小米手机能用吗?鸿蒙系统支持第三方手机!

    鸿蒙系统小米手机能用吗?鸿蒙系统支持第三方手机! 2021-05-19 15:18:09  来源:网络 扫码可以: 1.在手机上浏览 2.分享给微信好友或朋友圈 摘要: 近日在华为鸿蒙伙伴峰会上,华为 ...

  5. 鸿蒙系统支持980,鸿蒙手机上线时间 鸿蒙系统支持哪些手机2021最新汇总

    鸿蒙手机来了,从2019年公布到现在的正式发布,没想到华为这么迅速,而且华为EMUI微博更名HarmonyOS,在Android与iOS这两座大山面前,大家觉得鸿蒙系统值得更新体验吗?目前来说鸿蒙系统 ...

  6. 华为鸿蒙搭载哪些手机,华为鸿蒙系统支持哪些手机 可以装华为鸿蒙系统手机...

    华为鸿蒙系统支持哪些手机?9 月 10 日在华为 2020 开发者大会上,鸿蒙 OS 2.0 系统正式亮相,2020 年 12 月将发布手机 Beta 版本,明年华为智能手机将全面升级支持鸿蒙 2.0 ...

  7. 鸿蒙系统首批机型,华为鸿蒙系统支持的手机型号有哪些 首批公测机型有这些...

    华为鸿蒙系统支持的手机型号有哪些?对于这个问题相信大家都是比较关注的,如今鸿蒙2.0开发者测试版已经正式发布,究竟有哪些机型可以参与首批公测呢?一起来了解一下吧. 鸿蒙系统HarmonyOS 2.0手 ...

  8. p10可以适配鸿蒙吗,鸿蒙系统支持旧机型吗

    鸿蒙系统的发布引起了广大用户的关注,不少用户都想知道鸿蒙系统到底支不支持旧机型,老的华为手机适配于鸿蒙系统吗,为了更好的解决大家疑问,小编整理了详细的介绍,感兴趣的用户一起看看吧. 能升级鸿蒙系统的旧 ...

  9. 华为p4支持鸿蒙功能吗_华为P40或用鸿蒙 鸿蒙系统支持哪些手机 鸿蒙系统什么时候能用...

    华为鸿蒙系统2019年正式发布,随着华为鸿蒙系统发布不久,网上关于鸿蒙系统的消息更是层出不断.其中就有说法,认为华为P40或用鸿蒙.据此下面来看下关于鸿蒙系统未来应用的介绍,了解一下鸿蒙系统支持哪些手 ...

最新文章

  1. iMeta:青岛大学苏晓泉组开发跨平台可交互的微生物组分析套件PMS(全文翻译,PPT,视频)...
  2. 设置tomcat的默认jdk
  3. 财富第三极人类社会运行模型(附路线图)
  4. 快速git本地项目到github的关键命令及执行步骤(附上idea到git的步骤)
  5. 安装TPCC-MySQL报错
  6. Linux服务器安全防护十个方面
  7. ICON素材|装饰图标设计的技巧
  8. java猜单词游戏_9 java基础综合编程练习---猜单词游戏
  9. 中国抗衰老护肤品市场趋势报告、技术动态创新及市场预测
  10. C++ 智能指针简介
  11. python3中文乱码解决方法
  12. python的turtle库画苹果
  13. winxp怎么打开无线网络服务器,WinXP无线网络设置的方法
  14. 12-16 云计算平台基础架构
  15. 震撼心灵、洗礼灵魂--【经典的大师参禅的禅语】
  16. 利用计算机网线传东西,如何把文件通过一个网线从一个电脑传到另一个电脑上...
  17. java怎么实现手机投影,在Java中投射对象
  18. 支付宝支付 62009
  19. 基于JavaSwing开发模拟电梯系统+分析报告 课程设计 大作业源码
  20. Revit土建翻模:梁端点连接方式的操作及梁生成

热门文章

  1. css介绍css选择器
  2. 初入社会戏人生-初面试介绍
  3. C#桌面办公应用-工资管理系统系列五
  4. HTML5期末大作业:旅游网页设计与实现——旅游风景区网站HTML+CSS+JavaScript 景点静态网页设计 学生DW静态网页设计...
  5. 机器学习(二)-一元线性回归算法(代码实现及数学证明)
  6. fiddler 升级后抓取https流量各种失败后一定不要忘记这一招
  7. 外包 | py2 下的 pickle 转成 py3 下的 pickle
  8. 了解Maxicode二维码
  9. 第18章异步编程-bloc-自定义状态管理示例-BlocProvider
  10. 辰颐物语系统(开发、奖励规则)