「Unity游戏开发」向量在游戏开发中的应用(一)

向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只知道向量的基本知识,但对于如何将所学到的向量知识运用到实际的游戏开发中却不知所措。我计划写几篇关于向量在游戏中的应用的文章,总结一下在实际工作中所遇到过的运用向量机智处理问题的技巧。接下来要写的东西都是记录在我的云笔记中,现在计划整理一下后分享出来。
    对于向量的那些基本性质我不想说太多,有兴趣的读者可以自行查阅相关文档,这里只说向量的大小和方向。不知道读者朋友曾经玩过安卓上一款比较火的跳跃游戏没有,游戏名字叫「涂鸦跳跃」,英文名为「Doodle Jump」,游戏截图如下:
Doodle Jump
    在玩「涂鸦跳跃」时,不知道你有没有想过这么一个问题:从下往上跳跃会直接穿过平台,从上往下掉不会穿过平台,这是如何实现的?
    关于这个问题,我的思考是:可以利用小人运动的速度的方向来判定是否启用碰撞体,速度方向向上时禁用碰撞体,速度方向向下时启用碰撞体。可能我说的这个思路读者朋友还是不明觉厉,下面我用Unity3D写了一个小Demo来帮助理解我的思路。
先上动态效果图:
CubeJump

具体实现代码如下:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using UnityEngine;

public class PlayerController : MonoBehaviour
{
public Vector3 jumpForce = new Vector3(10, 35, 0);
private Rigidbody mRigidbody;
private BoxCollider boxCollider;

// 是否处于碰撞状态
private bool stayCollision = false;

void Awake()
{
this.mRigidbody = this.GetComponent<Rigidbody>();
this.boxCollider = this.GetComponent<BoxCollider>();
}

void Update()
{
// 当刚体静止时,按空格键跳跃才有效
if (mRigidbody.IsSleeping() && Input.GetKeyDown(KeyCode.Space))
{
// 给刚体施加一个力,是其运动起来
this.mRigidbody.AddForce(jumpForce);
}

if (this.mRigidbody.velocity.y > 0) // 速度方向向上
{
// 这里不能重复设置isTrigger,否则IsSleeping()方法会失效
// 这里具体原因不得而知,因为被官方封装起来了,
// 但是猜测是因为刚体规定自身方法没有调用时为休眠状态
if (!this.boxCollider.isTrigger)
this.boxCollider.isTrigger = true;
}
else if (!stayCollision) // Player没有发生碰撞
{
if (this.boxCollider.isTrigger)
this.boxCollider.isTrigger = false;
}
}

void OnTriggerEnter(Collider collider)
{
stayCollision = true;
}

void OnTriggerExit(Collider collider)
{
stayCollision = false;
}
}

在这个小案例中,运用了速度向量的方向来判断是向上碰撞还是向下碰撞。作为「向量在游戏开发中的应用」这个小系列文章的第一篇,就用这个非常简单的小案例来开始吧。后续会更精彩,但更新时间不定。

本Demo使用的的开发工具是Unity5.0.1f1和VS2013,建议下载源码后用Unity5.0.1f1或者更高的版本打开。源码地址:http://download.csdn.net/detail/wenxin2011/9453669


同系列文章

「Unity游戏开发」向量在游戏开发中的应用(一)

「Unity游戏开发」向量在游戏开发中的应用(二)

「Unity游戏开发」向量在游戏开发中的应用(三)