Unity3D 5.x 交互功能 - 碰撞檢測函數

来源:http://www.cnblogs.com/i-shanghai/archive/2016/06/21/5602892.html
-Advertisement-
Play Games

1,給第一人稱控制器添加腳本:playercollisions.js 腳本中只定義變數,先不添加方法: #pragma strict var door_open_time:float=3.0; var door_open_sound:AudioClip; var door_shut_sound:Au ...


1,給第一人稱控制器添加腳本:playercollisions.js 腳本中只定義變數,先不添加方法:

#pragma strict

var door_open_time:float=3.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip;

private var doorisopen:boolean=false;
private var doortimer:float=0.0;
private var currentdoor:GameObject;
 
View Code

2,給playercollisions.js中的變數指定對象:

  

3,然後添加碰撞觸發執行的方法:

function OnControllerColliderHit(hit:ControllerColliderHit){ 
    if (hit.gameObject.tag=="playerDoor" && doorisopen==false) { 
        opendoor(hit.gameObject); 
    }
}
 
    function opendoor(door:GameObject){ 
        doorisopen=true; 
        door.GetComponent(AudioSource).PlayOneShot(door_open_sound);
        door.transform.parent.GetComponent(Animation).Play();
    }
View Code

4,確定碰撞對象已經添加Collider碰撞組件,規則物體(Cube)添加Box Collider,不規則物體添加Mesh Collider:

   

  我們給Door添加Box Collider並增大Size Y ,方便碰撞操作:

  

5,處理碰撞的時候,可以藉助 print((hit.gameObject); 查看當前碰撞的對象是什麼

  是 Door 還是 OutPost:

  

6,判斷 hit.gameObject.tag=="playerDoor" 的時候,要保證大小寫一致

  

7,播放開門動畫的時候,註意教程中outPost和自己項目中outPost的Animations的區別:

  教程中的動畫進行了分割,而自己項目中的動畫沒有,所以我們只播放一次:

 door.transform.parent.GetComponent(Animation).Play();

  ------

8,5.x版本中的播放方法:

door.GetComponent(AudioSource).PlayOneShot(door_open_sound);

9,碰撞開門,播放聲音的JS代碼,添加到第一人稱後,即可實現碰撞開門、播放開門聲音:

#pragma strict

var door_open_time:float=3.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip;

private var doorisopen:boolean=false;
private var doortimer:float=0.0;
private var currentdoor:GameObject;
 

function OnControllerColliderHit(hit:ControllerColliderHit){  
    print(hit.gameObject);
    if (hit.gameObject.tag=="playerDoor" && doorisopen==false) { 
        opendoor(hit.gameObject); 
    }
} 
    function opendoor(door:GameObject){ 
        doorisopen=true; 
        door.GetComponent(AudioSource).PlayOneShot(door_open_sound);
        door.transform.parent.GetComponent(Animation).Play();
    }
View Code

 10,加入關門方法,3秒後再次播放動畫:

#pragma strict

var door_open_time:float=3.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip;

private var doorisopen:boolean=false;
private var doortimer:float=0.0;
private var currentdoor:GameObject;
private var currentDoor:GameObject;
 
     function Start(){ 
    }

     function Update(){ 
     //如果門打開,開始計時  超過3秒後 再吃執行動畫,並把開門時間重置為0
             if(doorisopen==true){ 
                 doortimer+=Time.deltaTime; 
                       print(doortimer);
                if(doortimer>door_open_time){
                    doortimer=0;
                    shutdoor(currentDoor); 
                }
         }
    }

    //檢測碰撞
function OnControllerColliderHit(hit:ControllerColliderHit){  
    print(hit.gameObject);
    if (hit.gameObject.tag=="playerDoor" && doorisopen==false) { 
            currentDoor=hit.gameObject;
        opendoor(hit.gameObject);  
    }
} 

   // //開門
    function opendoor(door:GameObject){ 
        doorisopen=true; 
        door.GetComponent(AudioSource).PlayOneShot(door_open_sound);
        door.transform.parent.GetComponent(Animation).Play();
    }
    // 關門
   function shutdoor(door:GameObject){ 
        doorisopen=false;  
        door.GetComponent(AudioSource).PlayOneShot(door_shut_sound);
        door.transform.parent.GetComponent(Animation).Play();
    }
View Code

11,整合開門、關門方法:

#pragma strict

var door_open_time:float=3.0;
var door_open_sound:AudioClip;
var door_shut_sound:AudioClip;

private var doorisopen:boolean=false;
private var doortimer:float=0.0;
private var currentdoor:GameObject;
private var currentDoor:GameObject;
 
     function Start(){ 
    }

     function Update(){ 
     //如果門打開,開始計時  超過3秒後 再吃執行動畫,並把開門時間重置為0
             if(doorisopen==true){ 
                 doortimer+=Time.deltaTime; 
                       print(doortimer);
                if(doortimer>door_open_time){
                    doortimer=0;
                    //shutdoor(currentDoor); 
                    door(currentDoor,false,door_shut_sound,"closedoor");
                }
         }
    }

    //檢測碰撞
function OnControllerColliderHit(hit:ControllerColliderHit){  
    print(hit.gameObject);
    if (hit.gameObject.tag=="playerDoor" && doorisopen==false) { 
            currentDoor=hit.gameObject;
        //opendoor(hit.gameObject);  
        door(currentDoor,true,door_open_sound,"opendoor");
    }
}   

   //對象,門的狀態,播放的聲音,播放的對象
    function door(thisDoor:GameObject,doorOpenOrClose:boolean,audio_clip:AudioClip,ani_name:String){ 
        doorisopen=doorOpenOrClose;
        thisDoor.GetComponent(AudioSource).PlayOneShot(audio_clip);
        thisDoor.transform.parent.GetComponent(Animation).Play(); //播放動畫 區分開門和關門
    }
View Code

 

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.popup中添加圖表信息 2.echat以控制項形式添加在map中 3.以marker形式添加在map demo源碼地址:https://github.com/shitao1988/leaflet-echartmarker ...
  • CONTENT(目錄) 前言 Variable declearation:three rules you can break 1.Don't set var statement in a block 2.Don't set var statement in a loop 3.Set a variab ...
  • 前言: 1.HTML5的發展非常迅速,可以說已經是前端開發人員的標配,在電商類型的APP中更是運用廣泛,這個系列的文章是本人自己整理,儘量將開發中不常用到的剔除,將經常使用的拿出來,使需要的朋友能夠真正快速入門,如果有哪些不清楚的地方或者錯誤,歡迎聯繫我 2.更新時間沒有規律,一般會在3天左右更新一 ...
  • 在現在的很多頁面中,都運用到了百度地圖來定位,例如: 像這樣的地圖,我們可以通過手動來進行放大、縮小、移動等來查找具體的地址,特別方便,在頁面上引用也顯得頁面很有特點,那麼,應該怎麼樣來製作這種地圖呢? 一、獲取源代碼 網址:http://api.map.baidu.com/lbsapi/creat ...
  • 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。 一、變數的作用域 要理解閉包,首先必須理解Javascript特殊的變數作用域。 變數的作用域無非就是兩種:全局變數和局部變數。 Javascript語言的特殊之處,就在於函數內部可以直接讀取全 ...
  • 近幾年,人臉識別技術在身份認證領域的應用已經有了較多應用,例如:支付寶、招行的取款、養老金領取等方面,但在杜絕假冒、認證安全性等方面,目前還是一個比較需要進一步解決的課題,特別是在移動端的活體認證技術方面。 本文介紹了在HTML5 環境下可以採用clmtrackr.js 檢測工具,結合人臉模型,實現 ...
  • 1、日期格式轉時間戮 2、時間戮轉日期格式 ...
  • 經常我們看電影都會看到電影結束後會出現一段介紹這個電影的導演、編劇、主演、友情出演等等一些電影信息的滾動字幕,那麼那個效果可以用html+css+div實現。具體實現代碼如下: html代碼: 滾動標簽:<marquee>要滾動的文字/圖像<img src=””> </marquee> 下麵是我對滾 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...