欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 22:06:15
...

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

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

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

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

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

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

接着添加下面的组件:

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

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

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

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BasicMovement : MonoBehaviour {

    public float speed = 10.0f;

    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
        //transform.position += input * speed * Time.deltaTime;
        gameObject.GetComponent<CharacterController>().Move(input * speed * Time.deltaTime);
    }
}

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

character controller

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

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

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

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

跟老菜鸟学C++
http://edu.csdn.net/course/detail/2901
跟老菜鸟学python
http://edu.csdn.net/course/detail/2592
在VC2015里学会使用tinyxml库
http://edu.csdn.net/course/detail/2590
在Windows下SVN的版本管理与实战 
http://edu.csdn.net/course/detail/2579