[Unity3D插件]2dToolKit系列三 碰撞檢測功能的實現以及障礙物的隨機擺放

貌似有一段時間沒更新2dtoolkit系列了,這段時間一直在忙着其餘事情,今天開始繼續這個插件系列的教程,網上搜索,貌似關於這個插件的教程無非仍是跟官方的教程很相似,有的甚至都沒有本身照着親手實踐一遍就直接Copy,對這樣博客的文章感受起步到任何做用,對本身沒有什麼深入的理解,對他人來講也只是搜出來一份相同品,也沒什麼收穫,還都浪費了你們的時間!因此我決定經過這個小遊戲項目來驅動式的學習這個2d插件,今天我看了以前寫的系列一和系列二的文章,貌似還收到了一些不錯的效果,很多人鼓勵我繼續寫下去,51CTO,CSDN,9Teach等各大技術論壇都紛紛轉載而且將這個系列推到了論壇首頁,今天收到份郵件,驚訝的發現原來個人文章也上頭條了,這無疑是對個人文章的一種確定,我將更有信心堅持下去!html


但若是學習2dtoolkit插件僅僅是看官方的文檔操做,不經過本身去動手實踐,不注意細節多是會碰到許多問題,這不我今天是深有感觸哇!一直到吃晚飯以前都是摸索一個問題,就是關於碰撞檢測的問題,我在小花上添加了自定義的不規則碰撞器,這裏能夠參考系列一(點擊打開)如何建立帶有碰撞器的精靈集合的,其實在那兒操做的時候就留了一個「隱患」,沒注意一個細節,致使今天很糾結,其實也不是沒注意了,只是那時候也不知道要注意這麼一點!面試

仍是回到以前的建立精靈集合,按照以前的操做,來到這一步算法


切記在選擇自定義Collider的時候要勾選上Convex,這是爲何呢?或許有人要問。緣由:網絡

meshcollider不能和非凸邊形發生碰撞
Mesh Colliders cannot collide with each other unless they are marked as Convex. Therefore, they are most useful for background objects like environment geometry.

app

我猜測多是跟碰撞算法有關,具體底層的碰撞算法是怎麼寫的,我只能是猜想,計算的是凸多邊形之間的碰撞檢測,這裏自定義碰撞邊緣,默認的就是MeshCollider碰撞,BoxCollider碰撞是矩形框碰撞,其實也就是特殊的凸多邊形了,但無疑碰撞的沒那麼精確而已。就是由於這個,我看論壇還有人家博客上寫的這個2dtoolkit教程都沒有這個提示,這讓新手會很糾結!這點我比較欣賞雨凇大哥,寫博客寫的很詳細!贊一個!但搜關於這個插件的教程,他也還沒寫,因此就只能本身摸索了,哈哈,正好也給我了這麼個本身機會!畫好不規則邊框之後,點擊Commit提交,而後less

下面咱們來進行碰撞檢測,dom

[csharp] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片ide

  1. //鼠標左擊控制主角精靈移動  學習

  2.     IEnumerator OnMouseDown()  優化

  3.     {  

  4.         print("MouseDown");  

  5.         Vector3 screenPosition = Camera.main.WorldToScreenPoint(transform.position);  

  6.         Vector3 mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);  

  7.         Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(mScreenPosition);  

  8.         //鼠標左擊  

  9.         while (Input.GetMouseButton(0))  

  10.         {  

  11.             mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);  

  12.             Vector3 pos = offset + Camera.main.ScreenToWorldPoint(mScreenPosition);  

  13.             pos.z = 0;  

  14.             transform.position = pos;  

  15.             yield return new WaitForFixedUpdate();  

  16.         }  

  17.     }  

  18.   

  19.     void OnTriggerEnter(Collider other)  

  20.     {  

  21.         if (other.tag == "flower")  

  22.         {  

  23.             print("Trigger觸發了");  

  24.         }  

  25.           

  26.     }  

  27.   

  28.     void OnTriggerStay(Collider other)  

  29.     {  

  30.         if (other.tag == "flower")  

  31.         {  

  32.             print("Trigger觸發中了");  

  33.         }  

  34.     }  

  35.   

  36.     void OnTriggerExit(Collider other)  

  37.     {  

  38.         if (other.tag == "flower")  

  39.         {  

  40.             print("Trigger結束了");  

  41.         }  

  42.     }  

這裏設置花的tag爲flower,而後拖動小龍進行跟花碰撞,哦,忘了說一點了,還記得我以前轉載過公司的基礎面試題麼,雖然遭到一些自認爲是老手的人的「嘲諷」,評論說有必要整理這麼簡單的問題嗎?如今看來我以爲仍是有必要的,至少我從中知道了一點,碰撞檢測的條件,必須具備剛體和碰撞器,或許好多人就知道必須有碰撞器,可能會忽略了剛體,我親自試驗過,還真是很被容易忽視,而後就又糾結怎麼碰撞不了的呢?雖然去公司都會問一些高級的問題:通常都是NGUI有沒有很熟,有沒有擴展;有沒有內存優化;會不會網絡資源更新;項目中遇到過的難題以及解決辦法?會寫Shader麼?會用Android和IOS第三方插件麼?之前的項目你都負責過那些?你對角色動做換裝熟悉麼?若是有一些大公司或許還會問圖形學的相關知識。但我感受這些都是在你已經緊緊掌握了基礎知識的前提下才有必要進一步掌握的,因此說基礎你都緊緊掌握了麼?細節仍是不能忽視的!!!廢話很少說了,進行碰撞檢測




看到可以成功的進行碰撞檢測,大功告成!

但後來問題又出現了,就是要得拖動小龍主動去碰撞花朵,才能檢測出碰撞,若是不人爲拖動,就沒有出現碰撞檢測,又以爲納悶了,後來發現了碰撞的條件,能夠對比這這個表格,碰撞列表


看官方的論壇,有人也碰到過這問題,我這兒給出地址,或許對你之後碰到這問題有所幫助

http://answers.unity3d.com/questions/433472/objects-passing-through-collision-because-of-trans.html

http://answers.unity3d.com/questions/187684/moving-object-with-transformposition-ignore-other.html

問題:


解答:



若是想兩個物體只發生物理碰撞效果,就是不會穿透,就不勾選IsTrigger選項


而後碰撞的物理效果


會發現小龍的最都被撞歪了,花也被「推」到後面去了,哇咔咔,這就起到物理效果,但咱們想要的效果並非這樣,咱們是須要能檢測出碰撞事件的,因此就勾選其中的一個IsTrigger便可,就能觸發OnTriggerEnter()方法


看下面檢測到了碰撞,代碼跟上圖同樣!就不重複了!

一直用的都是csdn,但苦惱的是CSDN沒有移動端的app,因此最近搞了個移動app,我將全部的博客都搬到移動平臺了,能夠掃描一下便可在移動平臺關注個人最新文章。


被碰撞的問題搞的糾結了兩天,總算是告一段落,寫下來就是花朵的隨機擺放,也比較簡單。

首先在場景中作一個預設,包含一上一下兩朵花,而後拖放四個到場景中


這裏用腳本作一個隨機的位置擺放,上下波動在[-0.8f,0],左右波動在[-0.1f,0.1f],這樣使得遊戲更逼真!

[csharp] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片

  1. using UnityEngine;  

  2. using System.Collections;  

  3. /// <summary>  

  4. /// 讓花朵的位置隨機,掛在doubleflower上  

  5. /// </summary>  

  6.   

  7. //小花朵上下位置範圍是[-0.82,0]  

  8.   

  9. public class randompos : MonoBehaviour {  

  10.   

  11.     public float speed;  

  12.     private float movespeed;  

  13.   

  14.     public float minPositionX;  

  15.     public float terPositionX;  

  16.     public float rannum;//波動範圍  

  17.   

  18.     // Use this for initialization  

  19.     void Start () {  

  20.         minPositionX = -6;  

  21.         terPositionX = 0;  

  22.         rannum = 0.1f;  

  23.   

  24.         //執行一次位置的隨機變更  

  25.         float ran = GetRandomNum(-0.82f, 0f);  

  26.         float ran1 = GetRandomNum(-rannum, rannum);  

  27.         //print(ran);  

  28.         transform.localPosition = new Vector3(transform.localPosition.x+ran1, ran, transform.localPosition.z);  

  29.     }  

  30.       

  31.     // Update is called once per frame  

  32.     void Update () {  

  33.   

  34.         movespeed = speed * Time.deltaTime;  

  35.         transform.Translate(Vector3.left * movespeed, Space.World); //向左移動  

  36.         if (transform.localPosition.x < minPositionX)  

  37.         {  

  38.             float ran = GetRandomNum(-0.82f, 0f); //上下波動範圍  

  39.             float ran1 = GetRandomNum(-rannum, rannum);//左右波動範圍  

  40.             print("上下波動:"+ran+",左右波動:"+ran1);  

  41.             transform.localPosition = new Vector3(terPositionX+ran1, ran, transform.localPosition.z);  

  42.         }  

  43.     }  

  44.   

  45.     float GetRandomNum(float min,float max)  

  46.     {  

  47.         return Random.Range(min, max);  

  48.     }  

  49.   

  50. }  

轉載請註明出處,謝謝!http://blog.csdn.net/dingxiaowei2013/article/details/21036859

在線演示:http://114.92.240.43/dingxiaowei/FlappyDragon.html

==================== 迂者 丁小未 CSDN博客專欄=================

MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

Unity QQ羣:375151422,858550,6348968         cocos2dx QQ羣:280818155

====================== 相互學習,共同進步 ===================

相關文章
相關標籤/搜索