Unity學習周報(一)

1.Transform

位置:世界坐標,當地坐標,通過屬性和方法操作;使用屬性的時候默認是世界坐標

調整位置:

通過屬性position調整:

[if !supportLists](1)[endif]transform.position+=transform.方向名;

transform.forward前,transform.right右,transform.up上等等

[if !supportLists](2)[endif]transform.position+=new

Vector3(x,y,z);

通過方法Translate方法調整:

transform.Translate(transform.方向名,Space.World或Space.Self);

transform.Translate(Vector3.方向名,Space.World或Space.Self);

每個游戲對象都有Transform組件,所以不用再在前面寫GameObject.了

通過方法

角度:軸心(旋轉的軸心)和中心(重心),通過屬性和方法操作

調整角度:

通過屬性eulerAngles(歐拉角)調整:

transform.eulerAngles+=new Vector3(x,y,z);

通過方法Rotate調整:

transform.Rotate(new Vector3(x,y,z));

縮放:游戲對象的大小

父子關系:Parent和Root

轉換父類與子類,操作完成后無法在層界面拖動更改。

使用屬性操作

TrGreen.parent = TrRed;

使用方法操作

TrGreen.SetParent(TrRed);

第二個值若為true,則TrGreen會以TrRed為中心。

TrGreen.SetParent(TrRed,true);

用來顯示子類的個數

print(TrGreen.childCount);

用來顯示索引的子類的名字,作用:對查找的子進行操作。

print(TrGreen.GetChild(0).gameObject.name);

GameObject.Find("");//比Transform.Find慢,Transform.Find是通過節點找的,

而GameObject.Find要通過層級關系對物體對象遍歷查找。

//查找一個物體對象

Transform? tr=TrGreen.Find("GameObject (1)");

print(tr.gameObject.name);

LookAt()方法:

TrGreen.LookAt(TrRed);

2.矯正坐標系

[if !supportLists](1)[endif]把游戲對象的正方向跟世界坐標軸的z軸正方向平行

[if !supportLists](2)[endif]建立一個空游戲對象

[if !supportLists](3)[endif]把空游戲對象的中心放在要矯正坐標的游戲對象的中心上

[if !supportLists](4)[endif]把要矯正的游戲對象作為空游戲對象的子物體(拖進空游戲對象里)

[if !supportLists](5)[endif]此時,這個空的游戲對象就是原來的游戲對象,對它進行操作即可。

3.input

[if !supportLists](1)[endif]通過鍵盤按鍵輸入

[if !supportLists](2)[endif]通過鼠標按鍵輸入

[if !supportLists](3)[endif]通過18個軸的值輸入,用Input.GetAxis(軸名稱);

[if !supportLists](4)[endif]太陽地球月亮模擬RotateAround公轉方法、Rotate自轉方法,用input實現坦克移動旋轉放大視野

4.time

時間縮放Time.timeScale:影響的是所有跟時間有關的,跟幀有關的不會受到影響

每幀的時間:Time.deltaTime:計時器用變量名+=Time.deltaTime實現

從游戲開始到現在的時間:Time.time:每幀是0.1秒

固定時間更新的FixedUpdate方法:發生在Update之前,默認每0.02s執行一次

5.GameObject

如果不加this.gameObject那么默認就是使用這個腳本組件的游戲對象

開啟、禁止組件:GetComponent<組件名>().enabled=true或false;

通過名字找游戲對象:游戲對象名.Find(”名字”);

調用其他腳本文件的方法:游戲對象名.GetComponent<腳本文件名>().方法名();

新建游戲對象:new GameObject(“新建游戲對象名”);

在代碼里臨時創建游戲對象:游戲對象名.CreatePrimitive(PrimitiveType.枚舉成員);

添加部件:游戲對象名.AddComponent<部件名稱>();

返回游戲對象自己:游戲對象名.activeSelf

設定游戲對象是否活動(顯示或隱藏):游戲對象名.SetActive(true或false);

標簽:作用:歸類,具有相同標簽的游戲對象可以看作一類食物

根據類型查找:FindObjectOfType<部件>();//根據類型查找最后使用泛型,因為不需要類型轉換,如果不是用泛型去查找,那么找到的返回值都是Object類型的,西藥進行類型轉換,期間有風險

所有的組件都能.出gameObject

查找子節點:Transform.Find();//查找的比較快的

克隆方法:Instantiate(克隆對象,克隆的位置,克隆的旋轉);

銷毀方法:Destroy(銷毀對象,銷毀倒計時);//可以不寫第二個參數

打印的方法:

(1)Debug是一個專門用來打印各種消息的類(建議使用,沒有約束條件)

(2)print(”打印的消息”);//是MonoBehaviour類中封裝的打印方法

類,當繼承MonoBehaviour的時候類名必須要跟腳本名字一致。因為只有繼承了MonoBehaviour,游戲對象才能掛載這個腳本

Start和Update是系統的回調方法,所以這兩個方法名字寫法是固定的

gameObject必須要繼承MonoBehaviour類才能使用

6.剛體和碰撞盒

碰撞器(盒)類型:

[if !supportLists](1)[endif]靜態碰撞器(Static Collider):沒有附加剛體而附加了碰撞器的游戲對象(常應用場景:環境模型)

[if !supportLists](2)[endif]剛體碰撞器(Rigidbody Collider):同時附加了剛體和碰撞器的游戲對象,通過腳本代碼添加的力和碰撞完全受物理引擎的影響

[if !supportLists](3)[endif]運動學剛體碰撞器(Kinematic Rigidbody Collider):同時包含碰撞器和剛體,并且激活IsKinematiic的游戲對象,不受物理引擎影響;只能通過transform組件移動;可以和其他的非運動學剛體以及角色控制器互相作用

[if !supportLists](4)[endif]角色控制器(Character Controllers):

應用場景:多用于制作一個類似人的角色;

第三人稱平臺游戲:

第一人稱射擊游戲的主要角色或任何敵對角色。

不遵循物理規則,不具有物理特性,如果要應用真正的物理作用到你的角色,必須用剛體;

永遠沿Y軸對齊(如果你的角色需要在空間中改變方向,也必須要用到剛體,但要注意調整剛體在角色上表現自然是很難的—困難一:游戲對象自身的非物理特性總想表現出來;困難二:剛體不能像角色控制器一樣可以從特定高度的臺階上平滑的滑下)

受碰撞檢測;

不會對加在它身上的力做出反應(如果你想讓你的游戲角色別物理效果影響,最好使用剛體);也不會自動推開其他剛體,但它額可以通過腳本施加力(通過添加OnControllerHit()函數)影響其他對象

不受力影響(但重力效果還是有的,也可以被代碼施加的力推動);

兩個物體發生碰撞的必要條件:

[if !supportLists](1)[endif]都有碰撞盒(角色控制器)

[if !supportLists](2)[endif]其中一個有剛體

[if !supportLists](3)[endif]帶有剛體的物體要處于運動狀態(剛體不運動的話會進入剛體休眠)

剛體休眠:

只要剛體的速度低于sleepAngulareVelocity和sleepVeclocity,該剛體就會開始休眠。其空閑一些幀后就會被設置為休眠狀態。

處于休眠狀態中的物體,不會再對其進行檢測和模擬。

好處:節約大量CPU開銷;

喚醒休眠的剛體的方法:

[if !supportLists](1)[endif]使用代碼施加外力;

[if !supportLists](2)[endif]剛體的屬性發生了變化;

[if !supportLists](3)[endif]和它通過關節連接的剛體發生了移動,因為連帶關系,所以它也被喚醒了;

[if !supportLists](4)[endif]被其他剛體碰撞器碰撞(只有處于運動狀態中的剛體或運動學剛體才可以喚醒它)

[if !supportLists](5)[endif]注意:靜態碰撞器無法喚醒休眠剛體的

7.碰撞檢測

三個方法:OnCollisionEnter(Collision被碰撞的碰撞器形式名字)進入、OnCollisionStay(Collision被碰撞的碰撞器形式名字)逗留、OnCollisionExit(Collision被碰撞的碰撞器形式名字)退出

只有剛體碰撞器碰其他碰撞器都可以產生碰撞檢測

把碰到的游戲對象改變顏色:被碰到的碰撞器形參.gameObject.GetComponent().material.color=new

Color(r,g,b);//Color.blue//Color類中的rgb是[0,1];

大小(縮放)(組件改為Transform,點出Scale屬性),分享材質(相同材質的游戲對象分享材質變色,分享后材質的顏色不再改變)(把material改為sharedMaterial)

8.觸發檢測

三個方法:OnTriggerEnter()進入、OnTriggerStay()逗留、OnTriggerExit()退出

除了靜態觸發碰撞器和靜態觸發碰撞器、靜態碰撞器碰撞沒有觸發信息,其他觸發器都能觸發信息

9.鼠標和碰撞盒檢測

這個腳本要掛在到有碰撞盒的游戲對象身上才起作用

七個方法:OnMouseEnter()進入、OnMouseOver()覆蓋、OnMouseExit()退出、OnMouseDown()按下、OnMouseUp()抬起、OnMouseUpAsButton()一個回程、OnMouseDrag()拖動

將屏幕坐標轉換成世界坐標:

transform.position=Camera.main.ScreenToWorldPoint(new

Vector3(x,y,z));

將屏幕坐標轉換成射線(通過鼠標點擊地面,移動坦克位置):

Ray ray=Camera.main.ScreenToRay(new Vector3(x,y));

10.射線檢測

射線投射信息(RaycastHit類):里面存儲了一些有關于檢測到的游戲對象的信息(collider、transform)

兩個Debug類的方法DrawRay畫射線、DrawLine畫直線(只是起到輔助作用,方便觀察,不是實際存在的線,打包之后不會存在)

物理類中方法Raycast(用來檢測射線第一個射到的游戲對象)和RaycastAll(用來檢測射線射到的所有游戲對象):

Physics.Raycast(檢測的射線,射線映射信息,檢測范圍,檢測的層,QueryTriggerInteraction.枚舉成員);

射線映射信息是一個輸出參數(out修飾),可以用它.出被檢測到的游戲對象的屬性;這個參數的類型是RaycastHit類型的,可以.出point(射線檢測到的點的位置)

檢測的層表示:~(1<<10)表示從第一層(0開始索引,2的0次方開始,每上升一層就乘一次2)開始,升到第11層,~表示取反,也就是除了第11層的游戲對象,其他層的游戲對象都能被檢測。

如果不取反,那么其中層的參數寫2的層數索引次方

一個枚舉:QueryTriggerInteraction中的三個枚舉值,0.都有影響1.忽略2.世界

RaycastAll()需要foreach來遍歷數組中的每一個檢測到的游戲對象,并得到組件進行操作

插值(數學方法,為了讓物體更平滑的移動):

(1)Vector3.Lerp(移動方向,目標位置-,所需時間);

(2)Vector3.MoveTowards(起始位置,目標位置,所需時間);

11.剛體

給碰撞器一個能觸發的圓形范圍:碰撞器名字=Physics.OverlapSphere(觸發范圍的中心點,觸發碰撞器的圓形范圍的半徑);

添加爆炸力:剛體名.AddExplosionForce(爆炸威力,爆炸中心,爆炸范圍);

添加力:剛體名.AddForce(向量值);//向量值:有方向有大小的值

速度:剛體名.velocity屬性;

角速度:剛體名.angularVelocity;

注意:這里的速度跟時間有關,如果Time.timeScale=0,則速度也會變為0

12.物理材質:

參數:

動態摩擦力、靜態摩擦力、彈力、摩擦力組合模式(平均值、最小值、相乘值、最大值)、彈力組合模式(平均值、最小值、相乘值、最大值)

13.角色控制器:

這里主要對比了一下:分別通過Transform、Rigidbody、CharacterController實現移動

Transform通過Translate方法實現移動,Rotate方法實現轉動;

Rigidbody通過velocity實現移動,angularVelocity實現轉動;

CharacterController通過SimpleMove()或者Move()實現移動,通過transform的轉動方法轉動;

注意這里:SimpleMove()和Move()的區別:

SimpleMove只能實現x-z軸的移動,y軸方向不能控制移動,但它可以實現重力效果;而Move能實現x-y-z軸的移動,但是沒有重力效果,如果需要重力,則需要自己手動寫要給重力值,讓自己的速度減等于這個重力值(如:v-=G)

把世界位置換成自身位置:一個儲存軸增量的變量=Transform.TransformDirection(一個儲存軸增量的變量);

//這句話必須在已經是世界坐標之后再使用,如果在沒生成世界坐標之前使用等于沒有用,這里牽扯到語句的執行順序

角色控制器的檢測方法:OnControllerCollierHit(ControllerCollierHit

hit);

一般如果想給一個游戲對象添加力,必須先判斷它是否有剛體且保證它不是運動學剛體,否則給它一個力是沒有物理效果的,就失去了意義

標準化力量,使向量模為1:向量名.normalized

判斷是否在地面:角色控制器名.IsGrounded(bool類型,用來判斷是否在地面)

14.物理關節:

鉸鏈關節:把兩個物體用鉸鏈關節連接,都安上碰撞器、剛體,其中一個勾上運動學剛體,沒有勾上運動學剛體的會以他們之間的一個可見的箭頭方向為旋轉軸旋轉(例:門和門柱,門會以門柱為軸打開關閉);

固定關節:把兩個物體通過固定關節連接,都安上碰撞器、剛體,其中一個勾上運動學剛體,通過這種方式把沒有勾上運動學剛體的游戲對象固定在運動學剛體上;

彈簧關節:把兩個物體通過固定關節連接,都安上碰撞器、剛體,其中一個勾上運動學剛體,在沒有勾上運動學剛體的游戲對象和運動學剛體之間有一根隱形的彈簧存在;

角色關節:用來固定角色的每個組成,讓它實現類似人的結構。。有點不太清楚吧。。。

Unity中可以通過JavaScript和C#(C Script)兩種編程語言編輯腳本程序,JavaScript的文本后綴是.js,而C#則是.cs文本格式

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容