1. 程式人生 > >網龍暑期訓練營第一週:MonoBehavior函式執行順序、碰撞與滑鼠事件

網龍暑期訓練營第一週:MonoBehavior函式執行順序、碰撞與滑鼠事件

本文通過實驗梳理第一週訓練營視訊中所提到的知識點,便於大家複習鞏固,也便於自己日後查閱。視訊內容主要分為三個部分:

  1. MonoBehavior的執行順序

  2. 碰撞事件

  3. 滑鼠事件

配合視訊使用效果更佳。

1.MonoBehavior的執行順序

執行順序的流程圖如下,通過程式碼實際測試情況對圖中順序進行驗證。

測試程式碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Diagnostics;
public class MonoTest : MonoBehaviour
{
    // Awake is called when the script instance is being loaded
    public void Awake()
    {
        DoLog();
    }
    //// Use this for initialization
    void Start()
    {
        DoLog();
    }
    //// Update is called once per frame
    void Update()
    {
        DoLog();
    }
    //// This function is called every fixed framerate frame, if the MonoBehaviour is enabled
    void FixedUpdate()
    {
        DoLog();
    }
    //// LateUpdate is called every frame, if the Behaviour is enabled
    void LateUpdate()
    {
        DoLog();
    }
    void OnGUI()
    {
        DoLog();
    }
    void Reset()
    {
        DoLog();
    }
    void OnDisable()
    {
        DoLog();
    }
    void OnDestroy()
    {
        DoLog();
    }
    public static void DoLog()        //獲取當前呼叫的方法名
    {
        StackTrace st = new StackTrace(true);
        StackFrame stackFrame = st.GetFrame(1);
        //var callInfo = string.Format("{0}:{1}.{2}",stackFrame.GetFileName(),stackFrame.GetFileLineNumber(),stackFrame.GetMethod().Name);
        var callInfo = stackFrame.GetMethod().Name.ToString();
        DoLog(callInfo);
    }
    public static void DoLog(string szMsg, params object[] args)
    {
        string log = string.Format("[{0}]{1}", DateTime.Now.ToString("HH:mm:ss.ffff"), string.Format(szMsg, args));
        UnityEngine.Debug.Log(log);
    }
}

將程式碼指令碼掛載在Camera下,執行後結果如下圖所示。

圖中可得,Awake()與Start()的執行順序最靠前,在兩個Update()之間穿插了許多個的FixedUpdate(),LateUpdate()在Update()執行之後呼叫。並在銷燬時呼叫OnDisable()和OnDestroy(),順序與流程圖中一致。

2.碰撞功能

本節實現視訊中提到的碰撞事件,碰撞事件的介紹如下圖

在場景中新增幾個Cube,掛載上Move指令碼控制移動。指令碼程式碼如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour {
    private float translateTimer ;
    private BoxCollider coll;
    private Rigidbody rigid;
        // Use this for initialization
        void Start () {
        coll = GameObject.Find("Plane").GetComponent<BoxCollider>();    //找到BoxCollider和Rigidbody
        //coll = this.GetComponent<BoxCollider>();
        rigid = this.GetComponent<Rigidbody>();
        translateTimer = 3f;
        }
        
        // Update is called once per frame
        void Update () {
                if(Input.GetKey(KeyCode.W))    //控制移動
                {
                        transform.Translate(Vector3.up * Time.deltaTime * 1);
                }
                //向下運動——S
                if(Input.GetKey(KeyCode.S))
                {
                        transform.Translate(Vector3.down * Time.deltaTime * 1);
                }
                //向左運動——A
                if(Input.GetKey(KeyCode.A))
                {
                        transform.Translate(Vector3.left * Time.deltaTime * 1);
                }
                //向右運動——D
                if (Input.GetKey(KeyCode.D))
                {
                        transform.Translate(Vector3.right * Time.deltaTime * 1);
                }
        if (coll != null)    
        {
            if (coll.isTrigger)    
                StopAllCoroutines();
            else
                StartCoroutine(OnTranslateMoveTime());
        }
        else
        {
            Debug.Log("無法找到collider");
        }
        }
    IEnumerator OnTranslateMoveTime()
    {
        yield return new WaitForSeconds(translateTimer);
        rigid.useGravity = false;
        transform.Translate(Vector3.up * Time.deltaTime * 1);
    }
    void OnCollisionEnter(Collision other)
    {
        Debug.Log("發生碰撞,呼叫OnCollisionEnter");
    }
    void OnCollisionStay(Collision other)
    {
        Debug.Log("正在碰撞,呼叫OnCollisionStay");
    }
    void OnCollisionExit(Collision other)
    {
        Debug.Log("結束碰撞,呼叫OnCollisionExit");
    }
    void OnTriggerEnter(Collider other)
    {
        Debug.Log("與觸發器產生碰撞,呼叫OnTriggerEnter");
    }
    void OnTriggerStay(Collider other)
    {
        Debug.Log("正在與觸發器進行碰撞,呼叫OnTriggerStay");
    }
    void OnTriggerExit(Collider other)
    {
        Debug.Log("結束與觸發器的碰撞,呼叫OnTriggerExit");
    }
}

首先測試剛體之間的碰撞,新增MoveTest和Plane兩個Cube,給它們新增上BoxCollider,為了方便測試,給MoveTest新增上BoxCollider,開啟重力(Use Gravity)

執行時可以看到MoveTest小球與Plane發生碰撞的過程中,效果如下

控制檯的輸出為

接下來模擬碰撞器與觸發器的碰撞情況

將Plane中的isTrigger勾選,並取消MoveTest中RigidBody的UseGravity,改為手動操作MoveTest的移動(W,A,S,D),二者由發生碰撞到相互離開時,控制檯的輸出如下

注意:此時即使MoveTest元件中含有剛體,也只觸發OnTrigger事件。

3.滑鼠事件

滑鼠常用事件如下

將場景中的小球MouseTest作為滑鼠事件的測試。為其新增指令碼MouseTest,程式碼如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MouseTest : MonoBehaviour {
    void OnMouseDown()
    {
        Debug.Log("滑鼠按下,呼叫OnMouseDown");
    }
    void OnMouseUp()
    {
        Debug.Log("滑鼠擡起,呼叫OnMouseUp");
    }
    void OnMouseEnter()
    {
        Debug.Log("滑鼠進入collider範圍,呼叫OnMouseEnter");
    }
    void OnMouseExit()
    {
        Debug.Log("滑鼠移出collider範圍,呼叫OnMouseEnter");
    }
}

測試結果如下圖

相關推薦

暑期訓練營第一MonoBehavior函式執行順序碰撞滑鼠事件

本文通過實驗梳理第一週訓練營視訊中所提到的知識點,便於大家複習鞏固,也便於自己日後查閱。視訊內容主要分為三個部分: MonoBehavior的執行順序 碰撞事件 滑鼠事件 配合視訊使用效果更佳。 1.MonoBehavior的執行順序

轉載成員函式的過載覆蓋隱藏

成員函式的過載(overload)、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。1 過載與覆蓋成員函式被過載的特徵:(1)相同的範圍(在同一個類中) ;(2)函式名字相同;(3)引數不同;(4)virtual 關鍵字可有可無。覆蓋是指派生類函式

113小時成為很歷害的人(第一)啟程

一、筆記概要 第一部份:xmind 第二部份:文字、 課上筆記、 二、學習參考: a、參考:老師給的參考材料 b、學習過程中,通過百度或者其它資源獲得更深度的理解。(連結、截圖、網址、文件) 精進-第一週:關於自習小組介紹說明(公益) 一、筆記概要 精進-

deeplearning.ai第二課第一深度學習實用技巧

1 訓練/驗證/測試集 機器學習/深度學習中,一般會把資料集分為訓練集(training set)、驗證集(validation set/development set,dev set)、測試集(test set)三部分。 訓練集用於對模型進行訓練;驗證集用於對單一指標進行確定,

C語言進階-第一作業01

1字串比對(10分) 題目內容: 題目說起來很簡單,你會讀到兩個字串,每個字串佔據一行,每個字串的長度均小於10000字元,而且第一個字串的長度小於第二個字串的。你的程式要找出第一個字串在第二個字串

第一Centos 7 基礎命令

系統關機重啟:     shutdown命令: shutdown [OPTIONS...] [TIME] [WALL...]         shutdown -r      &n

deeplearning.ai第四課第一卷積神經網路

1 計算機視覺 計算機視覺包含的典型任務有: 影象分類; 目標檢測; 影象風格轉換。 計算機視覺任務的特點是輸入資料量較大,對於一副1000 * 1000 * 3的影象而言,需要的輸入神經元數量為3百萬。假如第一隱藏層有1000個神經元,那麼

易雲課堂第一課程心得體會及課上筆記

      不斷進步,不斷前進! 第一課老師介紹了android studio的安裝和環境配置,再環境搭建好之後給出了一個DEMO,介紹了工程中的: 1.Activity:一個頁面 2. Layout

Python第一編程的概念python的介紹安裝python的變量python的運算符

代碼 .com 循環輸出 html targe .cn 次循環 概念 9.png 一、內容 二、練習: 1、使用while循環輸出1、2、3、4、5、6、8、9、10 方法一:說明:當count 等於7時,count加1,此時count的值為8,然後continu

《數據庫設計入門經典》讀書筆記——第一數據庫建模的過去現在

port 混合 如果 執行 很好 創建表 規則 什麽 增長 《數據庫設計入門經典》,現在學習的是這本書,雖然以前就看過類似的書,可能由於之前經驗不足,書中說的某些東西只消化了一部分,現在重溫一邊好懂多了。所以說讀第一遍讀不懂不要緊,過個一年半載的再來讀,還是會讀不懂的,哈哈

PyCharm入門第一建立並執行第一個Python專案

步驟1:建立並執行您的第一個Python專案 在你開始之前 確保滿足以下先決條件: 您正在使PyCharmCE或Professional。 您已經安裝了Python本身。如果您使用的是macOS或Linux,那麼您的計算機已經安裝了Python。你可以從python.org獲

Redis第一安裝,執行,常用命令;

本文只作為參考學習: 1:下載redis地址: https://github.com/MSOpenTech/redis/releases 解壓檔案就可以看到以下檔案目錄: 開啟一個 cmd 視窗 使用 cd 命令切換目錄到 C:\redis 執行: redis-server.exe

第一啟用函式

啟用函式是神經網路中重要的關鍵元素之一。如果沒有啟用函式,神經網路就是一個線性組合的函式,而生活中絕大多數模型均是非線性的,因此模型的可擴充套件性非常差,其效果並不比羅輯迴歸更好。而在神經網路中加入啟用函式,就增加了神經網路的非線性。 比如XOR(抑或函式),無法通過原始線

C#程式設計基礎第一C#和.NET框架VS軟體基本使用編寫第一個C#程式

1、.NET平臺和C#語言 .NET 是微軟公司推出的平臺開發環境 C#(C Sharp)是一種強大的、面向物件的程式開發語言,是專為 .NET 開發而設計出的語言。 2002年微軟釋出了.NET框架的第一個版本,是一種比MFC和COM程式設計技術更一致面向物件的環境。

python第一input()函式

在使用input()內建函式輸入數字時,需注意一點:input()的返回值始終是字串,所以type(number)永遠是<class ‘str’>。 今天第一天正式接觸python,為自己想要達到的目標努力著。 我個人比較喜歡python的一點就是

VIR via C#第一CLR的執行模型

什麼是CLR:          CLR是微軟為.net的虛擬機器取得名字。它定義可一個程式碼執行的環境(就相當於基於window上的小型的作業系統)          CLS:支援CLR的各種語言之間,有各種不同的特性和語法。為了支援各種語言之間的互操作性。      

助推如何做出有關健康財富幸福的最佳決策(2017年諾貝爾經濟學獎獲得者理查德·泰勒作品)

體系 通過 知識 環境 定義 必須 log 貸款 .com 3星|《助推》:懶惰和不理性是人之常情,精心設計的默認選項有助於全社會 2017年的諾貝爾經濟學獎已經對本書第一作者的學術水平給出了評價。不過做為經濟學外行,我對這本書的評價是3星。想了解這位學者的學術思想,

Java開發利器IntelliJ IDEA的安裝配置使用 視訊教程 百度雲盤

IntelliJ IDEA是一款功能強大的開發工具,在程式碼自動提示、重構、J2EE支援、各類版本工具(如git、svn、github)、maven等方面都有很好的應用。IntelliJ IDEA有免費的社群版和付費的旗艦版。免費版只支援Java等為數不多的語言和基本的IDE特性,旗艦版還支

RPython手牽手資料框的構建讀取基本描述

在雙11免費Get新知識的人,才是最會花錢的人,也將是最會賺錢的人! 別的專場拼消費,唯有天善學院,投資你的未來! ▲詳情點選▲ 作者:黃天元,復旦大學博士在讀,目前研究涉及文字挖掘、社交網路分析和機器學習等。希望與大家分享學習經驗,推廣並加深R語言在業界的應用。

Excel函式公式IF函式和ANDOR函式的組合多條件判斷技巧

經常使用Excel函式的小夥伴們都知道,在Excel中使用頻率最高的還是那些比較簡單的函式,其中IF函式就是高頻率函式之一,那麼,能不能用IF函式來進行多條件運算呢? 一、IF+AND:同時滿足多個條件 目的:將“上海”地區的“男”通知標識為“Y”。 方法: 在目標單元格中輸入公式:=IF(AND(D