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

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

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

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

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

文章插图
接着添加下面的组件:
7  游戏制作之路角色与物品之间的碰撞

文章插图

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

文章插图
经过这样操作之后,就可以添加 了,如下:
7  游戏制作之路角色与物品之间的碰撞

文章插图
由于添加了这个组件,那么脚本代码里 , 也需要修改一下,才可以使用这个组件 , 把代码修改如下:
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函数时才会移动 。他的运动收碰撞的约束 。
到这里,就完成了碰撞检测了,运行一下,可以看到遇到障碍物就停下来了 , 如下图:
7  游戏制作之路角色与物品之间的碰撞

文章插图
最后 , 你可以愉快地玩耍这个游戏了,不用担心再上天入地 。
跟老菜鸟学C++
跟老菜鸟学
在里学会使用库
【7游戏制作之路角色与物品之间的碰撞】在下SVN的版本管理与实战