向量在游戲開發中是非常實用的,我們在學校學完向量的知識后,只知道向量的基本知識,但對于如何將所學到的向量知識運用到實際的游戲開發中卻不知所措。我計劃寫幾篇關于向量在游戲中的應用的文章,總結一下在實際工作中所遇到過的運用向量機智處理問題的技巧。接下來要寫的東西都是記錄在我的云筆記中,現在計劃整理一下后分享出來。
對于向量的那些基本性質我不想說太多,有興趣的讀者可以自行查閱相關文檔,這里只說向量的大小和方向。不知道讀者朋友曾經玩過安卓上一款比較火的跳躍游戲沒有,游戲名字叫《涂鴉跳躍》,英文名為「Doodle Jump」,游戲截圖如下:
在玩《涂鴉跳躍》時,不知道你有沒有想過這么一個問題:從下往上跳躍會直接穿過平臺,從上往下掉不會穿過平臺,這是如何實現的?
關于這個問題,我的思考是:可以利用小人運動的速度的方向來判定是否啟用碰撞體,速度方向向上時禁用碰撞體,速度方向向下時啟用碰撞體。可能我說的這個思路讀者朋友還是不明覺厲,下面我用Unity3D寫了一個小Demo來幫助理解我的思路。
先上動態效果圖:
具體實現代碼如下:
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
同系列文章
本文作者: Sheh偉偉
本文鏈接: http://davidsheh.github.io/2016/03/05/「Unity游戲開發」向量在游戲開發中的應用(一)/
版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協議。轉載請注明出處!