一直沒有時間寫博客
昨天我的CarWaypoints插件也告一段落了
今年沒回家,過年就我一個人
挺無聊的,那就休息一天寫幾篇博客吧
我的代碼可能很少,但是思路很重要
希望不懂的朋友別只copy代碼
賽車游戲的話賽車難免會沖出跑道、掉入水坑、卡在障礙物上....等情況
那么問題來了,遇到這些情況怎么辦呢?
玩家玩得好好的,難道就因為遇到這些情況要退出游戲重新進入嗎?
那當然是不現實的,要是我的話果斷卸載游戲
還要罵一句做游戲的人是腦殘啊
我想你不希望玩家罵你是腦殘吧,哈哈哈
新技能,趕快GET起來
遇到這類情況通常的賽車游戲做法是復位到賽道中央
這個功能聽起來貌似挺簡單的,但實際上做起來還是有些小復雜的
讓我們脫掉衣服直奔主題吧
首先,我們需要waypoint
我昨天剛做好這個插件
CarWaypoint插件教程以及下載地址:http://www.cnblogs.com/shenggege/p/4295616.html
ok,編輯好路標點數據后我們整理一下復位功能的思路
當賽車復位時
我們需要獲得離賽車距離最近的一個路標點
然后設置賽車的車頭朝向為當前最近路標點的朝向
當然,我們也要把賽車的移動速度和角速度歸零
以保證賽車復位后不會自動向前沖(你也可以不歸零)
思路就是這么簡單,下面我們來看看代碼怎么實現
1 /// 獲取距離最近的路徑點 <summary> 2 /// 獲取距離最近的路徑點 3 /// </summary> 4 /// <param name="DPs">路徑點集合</param> 5 /// <param name="myPosition">當前坐標</param> 6 /// <returns>返回最近距離的路標點</returns> 7 private WaypointsModel GetClosestWP(List<WaypointsModel> all, Vector3 myPosition) 8 { 9 WaypointsModel tMin = null; 10 float minDist = Mathf.Infinity;//正無窮 11 12 for (int i = 0; i < all.Count; i++) 13 { 14 float dist = Vector3.Distance(all[i].Position, myPosition); 15 if (dist < minDist) 16 { 17 tMin = all[i]; 18 minDist = dist; 19 } 20 } 21 return tMin; 22 }
這是一個獲取距離最近的路標點的方法
用for循環計算所有路標點距離當前賽車位置的距離
取出最小距離的路標點,這個不難理解吧,我們繼續!
1 /// 重置賽車 <summary> 2 /// 重置賽車 3 /// </summary> 4 private void RecoverCar() 5 { 6 //獲取距離最近的路標點 7 WaypointsModel ClosestWP = GetClosestWP(WaypointsModelAll, transform.position); 8 9 //置賽車位置 10 transform.position = ClosestWP.Position; 11 12 //置車頭朝向 13 transform.rotation = Quaternion.LookRotation(ClosestWP.Rotation * Vector3.forward); 14 15 //移動速度歸零 16 rigidbody.velocity = Vector3.zero; 17 18 //角速度歸零 19 rigidbody.angularVelocity = Vector3.zero; 20 }
這個方法更簡單了是吧!
獲取到最近的路標點后在設置賽車的位置朝向,歸零參數即可
這樣做的確而已復位了,但是運行游戲跑一局發現還是有一些小問題
什么問題呢?你的賽車明明跑到某路標點之前了,但是復位之后,居然倒退到這個路標點的位置了
不知道我這么說能不能理解,如果不理解馬上運行你的游戲跑一局試試就知道了
那我們要怎么解決這個問題呢
當我們復位的時候,賽車不僅僅是復位到賽道中央,還縮短了一段距離
為了解決這個問題,我們在寫一個新的方法,並且修改剛才寫的代碼,如下:
1 /// 重置賽車 <summary> 2 /// 重置賽車 3 /// </summary> 4 private void RecoverCar() 5 { 6 //獲取距離最近的路標點 7 WaypointsModel ClosestWP = GetClosestWP(WaypointsModelAll, transform.position); 8 9 //下個路標點索引 10 int nextIndex = ClosestWP.Index + 1; 11 12 //最近路標點 13 Vector3 nearestPoint; 14 15 //下一個復位點索引 小於 路標點數量 - 1 16 if (nextIndex < WaypointsModelAll.Count - 1) 17 { 18 //獲取兩個路標點間離賽車最近的點 19 nearestPoint = NearestPoint( 20 ClosestWP.Position, 21 WaypointsModelAll[nextIndex].Position, 22 transform.position); 23 } 24 else 25 { 26 //最后一個點和起點之間時取最后一個點的位置 27 nearestPoint = WaypointsModelAll[WaypointsModelAll.Count - 1].Position; 28 } 29 30 transform.position = nearestPoint; 31 transform.rotation = Quaternion.LookRotation(ClosestWP.Rotation * Vector3.forward); 32 rigidbody.velocity = Vector3.zero; 33 rigidbody.angularVelocity = Vector3.zero; 34 } 35 36 /// 獲取兩點之間離賽車的最近點 <summary> 37 /// 獲取兩點之間離賽車的最近點 38 /// </summary> 39 /// <param name="lineStart">最近路標點</param> 40 /// <param name="lineEnd">下一個路標點</param> 41 /// <param name="point">賽車位置</param> 42 /// <returns></returns> 43 private Vector3 NearestPoint(Vector3 lineStart, Vector3 lineEnd, Vector3 point) 44 { 45 //線方向 46 Vector3 lineDirection = Vector3.Normalize(lineEnd - lineStart); 47 48 //最近點 49 float closestPoint = Vector3.Dot((point - lineStart), lineDirection); 50 51 //返回最近點 52 return lineStart + (closestPoint * lineDirection); 53 }
思路看下圖:
ok,現在保存代碼,在運行游戲復位試試
怎么樣,是不是會自動計算出最近的點了!
復位點功能就這樣輕松實現了
我的游戲中是不需要計算出最近的點,只需要得到最近的路標點位置就可以了
所以具體的實現方案按照你的需求來做,這里我提供的僅僅是思路
先發布這篇文章到首頁,每發一次首頁都要間隔六小時比較蛋疼
我在寫兩篇關於賽車游戲的檢測文章,一會兒直接把地址貼到這篇文章中
復位點優化以及其他功能地址:http://www.cnblogs.com/shenggege/p/4295986.html
文中不足之處歡迎批評指正,如果本文對你有幫助請點一下右下角的推薦
本文鏈接:http://www.cnblogs.com/shenggege/p/4295617.html