首页 >> 大全

游戏制作之路(7)角色与物品之间的碰撞

2024-01-04 大全 34 作者:考证青年

在前面介绍了地面与角色的关系,通过坐标就可以解决角色不入地的问题。但是如果在场景里有多个物器,比如桌子、台等等,这些物品大小不一样,因此距离也不一样,就不能通过固定设置来达到穿墙而过了,那么怎么办呢?本文就来解决这个问题,在场景里创建几个立方体,按如下摆放:

人物角色互相碰撞的手游__人物碰撞

创建的物体,都需要把y轴的坐标设置为1,这时就刚刚好在地面之上。其它坐标随意设置即可,大体看起来像上图这样就可以。当然,它的大小你也可以看着顺眼的方式来设置,这都没有太大关系,做完这些设置之后,我们按下play来运行一下,就会发现如下图一样,角色可以进入立方体的障碍物里,这跟现实世界里,人不能穿过桌子的现象不符合啊,又要怎么样来修改呢?是否感觉到有点头痛了?其实不用担心,因为unity已经为我们考虑这些问题了,需要使用碰撞检测解决。

人物角色互相碰撞的手游__人物碰撞

不过,仔细的读者,也许会发现这个角色已经有一个组件,这个组件是干什么用呢?其实这个组件就是用来碰撞检测的,如果再检查一遍里所有物体都自动带有这个组件,自然就不会出上面的这个问题?难道见鬼了。其实不是,在unity里要实现碰撞检测,不能用使用变换来实现,意思就是说,使用这个组件来改变位置和大小,并不会应用碰撞检测系统的功能,因此,必须使用其它工具来实现这个碰撞检测。这个工具就叫做角色控制器 。那么接着下来先把角色这个删除掉,如下图:

人物角色互相碰撞的手游_人物碰撞_

接着添加下面的组件:

人物碰撞_人物角色互相碰撞的手游_

人物碰撞_人物角色互相碰撞的手游_

经过这样操作之后,就可以添加 了,如下:

人物碰撞_人物角色互相碰撞的手游_

由于添加了这个组件,那么脚本代码里,也需要修改一下,才可以使用这个组件,把代码修改如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BasicMovement : MonoBehaviour {public float speed = 10.0f;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));//transform.position += input * speed * Time.deltaTime;gameObject.GetComponent().Move(input * speed * Time.deltaTime);}
}

在代码里,要使用 ,就需要使用函数.,是一个对象,指的是这个脚本所附着的游戏物件,也许你会发现还有一个叫类,它是制造的母体,它是一个类别,是一个个体,一个实际的人。接着使用函数,它有一个尖括号把类型引用,这是使用类型定义,这里是获取这种类型的组件,由于绑定这个脚本只有一个这样的组件,就可以使用了。如果不存在,就会返回null。因此,.(),就是获取到角色控制组件,然后调用它的方法Move进行移动,这样当碰到其它物体,就不会再移动过去,达到碰撞检测的功能。

角色控制器可以让你更容易的处理有有碰撞的运动,同时不用处理刚体。(也就是说角色控制器负责处理角色的移动,如果添加角色控制器,就不用在添加刚体组件)。角色控制器不受力的影响,并且只有当你调用move函数时才会移动。他的运动收碰撞的约束。

到这里,就完成了碰撞检测了,运行一下,可以看到遇到障碍物就停下来了,如下图:

人物角色互相碰撞的手游__人物碰撞

最后,你可以愉快地玩耍这个游戏了,不用担心再上天入地。

跟老菜鸟学C++

跟老菜鸟学

在里学会使用库

在下SVN的版本管理与实战

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了