unity3d 賽車游戲——復位點檢測


一直沒有時間寫博客

昨天我的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM