日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity(一)Unity脚本程序开发

發布時間:2024/7/23 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity(一)Unity脚本程序开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近實驗室有AR的項目,需要用Unity進行開發,一邊學習一邊把知識總結下來。在開始項目之前討論過項目的技術方案,用Unity開發還是用Unreal開發,本人在兩種游戲引擎上都有過初步的接觸,認為Unreal作為后起之秀確實在某種程度上強于Unity,比如軟件的設計、畫面逼真程度,但作為一名程序員,實在對藍圖編程無感,對代碼更加放心,還是更喜歡Unity的編程風格,因此選擇了Unity,開始了漫長的Unity學習之路,學習資料是《Unity 5.X 3D游戲開發技術詳解與典型案例》,歡迎交流。

一、Unity腳本概述

Unity腳本繼承自MonBehaviour類,類中定義了各種回調方法,如Start、Update和FixedUpdate。

public class NewBehaviourScript: MonoBehaviour{...}

開發腳本時,主要時繼承MonoBehaviour類并重寫其中特定的方法。

Start方法:游戲場景加載時被調用,在該方法可以寫一些游戲場景初始化的代碼。

Update方法:在每一幀渲染之前被調用,大部分游戲代碼在這里執行,除了物理部分的代碼。

FixedUpdate方法:在固定的物理時間步調調用一次,基本物理行為代碼執行的地方,如剛體Rigidbody,其中代碼的執行和游戲的幀速率無關。

需要注意的是,1.在創建腳本時,類名字必須匹配文件名。2.類中的成員變量可以時private、protected和public,如果想在屬性查看器中顯示,其必須是public類型的。3.盡量避免在類中使用構造函數。

二、Unity腳本的基礎語法

1.常用操作

Unity中很多對游戲對象的操作都是在腳本中修改對象的Transform(變換屬性)與Rigidbody(剛體屬性)參數來實現的。

讓物體繞x軸旋轉20°和讓物體向前移動1個單位長度:

this.transform.Rotate(20,0,0); //繞x軸旋轉20° this.transform.Translate(0,0,1) //向前移動1個單位長度

第四個參數為Space枚舉類型,Space.Self相對于自身軸(默認),Space.World相對于世界坐標系統。

2.記錄時間

Time類中重要的變量為deltaTime,指的是從最近一次調用Update或FixedUpdate方法到現在的時間,如果想均勻地旋轉一個物體,不考慮幀速率的情況下,可以乘以Time.deltaTime。

public GameObject gameObject; //聲明一個游戲對象 void Update(){Vector3 te = gameObject.transform.position; // 獲取游戲對象的位置坐標te.y += 5*Time.deltaTime; //沿y軸每秒上升5個單位gameObject.transform.position = te; //設置游戲對象的位置坐標 }

3.訪問游戲對象組件(Component)

組件屬于游戲對象,是游戲的屬性,變量是在腳本中體現的,常用的組件可以通過簡單的成員變量取得,所有的腳本都是組件。

?

常見的成員變量
組件名稱變量名稱組件名稱變量名稱
TransformtransformRigidbodyrigidbody
RendererrendererCameracamera
LightlightAnimationanimation
Collidercollider??

在Unity 腳本中,附加到游戲對象上的組件可以通過GetComponent方法獲得。

transform.Translate(1,0,0); //沿x軸移動一個單位,變量訪問 GetComponent<Transform>().Translate(1,0,0) //沿x軸移動一個單位,組件訪問

也可以通過GetComponent方法獲取其他的腳本,比如有一個HelloWorld的腳本,里面有一個sayHello方法,HelloWorld腳本要與調用它的腳本附加在同一游戲對象上。

HelloWorld helloWorld = GetComponent<HelloWorld>(); //獲取“HelloWorld”腳本組件 helloWorld.sayHello(); //執行sayhello方法

注意:C#中只有public類型的變量和方法才能在所有其他類中使用,private類型的變量和方法只能在自身類中使用,protected類型的變量和方法只能在子類和同命名空間下的類中使用。

4.訪問其他游戲對象

(1)通過屬性查看器指定參數。

(2)確定對象的層次關系,游戲對象在游戲組成對象列表中存在父子關系,在代碼中可以通過獲取Transform組件來找到子對象或父對象。

transform.Find("hand").Translate(0,0,1) //找到“hand”子對象 transform.parent.Translate(0,0,1) //找到父對象 transform.Find("hand").GetComponent<Test>().doSomething(); //找到子對象“hand”,同時執行“Test”腳本中的doSomething方法 transform.Find("hand").GetComponent<Rigidbody>()AddForce(0,0,2)//加一個沿z軸的大小為2的力

(3)通過名字或標簽獲取游戲對象

FindWithTag方法獲取指定標簽的游戲對象,Find方法獲取指定名字的游戲對象。

GameObject name = GameObject.Find("somename"); //獲取名稱為“somename”的游戲對象 name.transform.Translate(0,0,1); name.GetComponent<Test>().doSomething(); //執行Test腳本中的doSomething方法 GameObject tag = GameObject.FindWithTag("sometag"); //獲取標簽為“sometag”的游戲對象 tag.GetComponent<Test>().doSomething();

(4)通過傳遞參數獲取游戲對象

一些事件回調方法的參數中包含了特殊的游戲對象或組件信息,例如觸發碰撞事件的Collider組件。在OnTriggerStay方法的參數中有一個碰撞體參數,通過這個參數能得到碰撞的剛體。

void OnTriggerStay(Collider other){ //重寫OnTriggerStay方法if(other.GetComponent<Rigidbody>()){ //如果該游戲對象上有剛體組件other.GetComponent<Rigidbody>().AddForce(0,0,2); //給剛體施加一個力} }

(5)通過組件名稱獲取游戲對象

Unity腳本中可以通過FindObjectsOfType方法和FindObjectOfType方法來找到掛載特定類型組件的游戲對象。

Test test = FindObjectOfType<Test>(); //理解為Test代表掛載Test組件的游戲對象的類 Debug.Log(test.gameObject.name); //類比this.gameObject,this理解為當前腳本組件 Test[] tests = FindObjectsOfType<Test>(); foreach (Test re in tests){Debug.Log(te.gameObject.name); }

注:關于GameObject與gameObject的理解,GameObject是一個類,是一個容器,可實例化為游戲對象,包含不同組件;gameObject獲得當前腳本所掛載的對象,是一個實例化的結果,上例中test.gameObject可類比此意。gameObject是組件附加的游戲物體(不是組件,是MonoBehaviour類中可繼承的成員變量),一個組件總是被附加到一個游戲物體。

5.向量

Vector2類表示二維向量,Vector3表示三維向量。向量初始化:

public Vector3 position1 = new Vector3(); public Vector3 position2 = new Vector3(1,1,2); void Start(){position1.x = 1;position1.y = 1;position1.z = 2; }

Vector3類中定義了很多常量,對應特殊的Vector3值。

Vector3類中常量對應的值
常量常量
Vector3.zeroVector(0,0,0)Vector3.oneVector(1,1,1)
Vector3.forwordVector(0,0,1)Vector3.upVector(0,1,0)
Vector3.rightVector(1,0,0)??

Vector3求兩點之間的距離:

public Transform ren; //如果聲明的是一個組件變量,需要在屬性查看器中拖拽游戲對象到變量處并確定它的值 void Update(){if(Vector3.Distance(ren.position,transform.positon)<10){Debug.Log(ren.position);} }

6.靜態成員變量

在C#腳本中可以通過static關鍵字來創建全局變量,這樣就可以在不同腳本間調用這個變量。

public static int test;

如果想從另外一個腳本中調用變量,可以通過“腳本名.變量名”的方法來調用。

Test.test = 1; //為Test腳本中的“test”變量賦值

未完待續

總結

以上是生活随笔為你收集整理的Unity(一)Unity脚本程序开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。