- Unity 4 3D開發實戰詳解
- 峰 杜化美 張月霞 索依娜編著
- 112字
- 2019-01-01 21:15:05
3.6 C#腳本綜合案例
上一節的案例中所使用的腳本語言是JavaScript腳本,本節將根據上一節的案例,使用C#腳本語言來開發該案例,兩個案例只是在球紋理的選擇場景和文件名稱上做了一些小的改變,同時,對腳本做了一些優化,使用更少的代碼實現相同的功能。
3.6.1 立方體旋轉場景實現
在本場景中具體的設計目的就是實現立方體的轉動,為了在視覺上呈現出不同的效果,進而設計了6個具有不同紋理貼圖的立方體,并且都具有一定的自轉效果,當選中某個立方體時,立方體反向旋轉同時轉速加快,變得與眾不同,在此默認第一個立方體為選中狀態,并將此時選中的立方體的紋理記錄下來。運行效果如圖3-19、圖3-20和圖3-21所示。

▲圖3-19 最終運行效果圖1

▲圖3-20 最終運行效果圖2

▲圖3-21 最終運行效果圖3
1.場景搭建的具體過程
(1)在開發前首先要對案例開發需要的資源進行收集,主要需要的資源如表3-14所示。
表3-14 立方體旋轉場景實現所需的資源

續表

(2)~(5)的操作步驟和3.5節所對應的(2)~(5)操作步驟類似,具體的可以參考3.5節所對應的步驟來操作,這里由于篇幅的限制就不再贅述了。
(6)單擊GameObject→Create Other→Cube菜單,在場景中創建一個球體,在此改名為Cube1,并在屬性編輯器中設置具體的參數,然后依次創建其他5個立方體,命名為Cube2~Cube6,擺放位置如圖 3-22所示。

▲圖3-22 創建的 6個立方體
(7)此后的操作步驟請參考3.5節中所對應的第(4)~(6)步驟來操作,這里不再贅述。
2.立方體旋轉的實現以及GUI組件的應用
(1)GUI組件的應用,即創建一個名字為“StartGame.cs”的腳本,將此腳本掛載到攝像機上,即可實現GUI組件的應用,腳本的代碼如下。
代碼位置:見隨書光盤中源代碼/第3章目錄下的CubeBal /Assets/Script / StartGame.cs。
1 using UnityEngine;
2 using System.Collections; //引入系統包
3 public class StartGame : MonoBehaviour {
4 public Texture quedingTexture; //確定按鈕紋理圖引用
5 public Texture tuichuTexture; //退出按鈕紋理圖引用
6 public Texture anlibiaotiTexture; //案例標題按鈕紋理圖引用
7 public GUIStyle MyStyle; //定義自己的GUIStyle
8 public static bool isTouched = false; //是否有Cube被觸摸
9 public static string touchedCube = null; //被觸摸Cube的名字
10 void Start(){ //重寫Start函數
11 PlayerPrefs.SetString("Tex","Tex1"); //默認保存第一個Cube的紋理圖
12 }
13 void Update () { //重寫Update函數
14 foreach (Touch touch in Input.touches)//對當前觸控事件循環
15 { //聲明一條由屏幕觸控點發出垂直于屏幕的射線
16 Ray ray = Camera.main.ScreenPointToRay(touch.position);
17 RaycastHit hit;//聲明一個RaycastHit型變量hit
18 if (Physics.Raycast (ray, out hit)) //判斷此物理事件
19 {
20 isTouched = true ; //當射線碰撞到Cube時將isTouched設為true
21 //獲得射線碰撞Cube的名稱
22 touchedCube = hit.transform.root.transform.name;
23 SetTex(touchedCube); //調用SetTex函數
24 }}
25 if (Application.platform == RuntimePlatform.Android)//判斷運行平臺是否為Android平臺
26 {
27 if (Input.GetKeyUp(KeyCode.Home) ) //判斷當前按鍵是否為Android設備的Home鍵
28 {
29 Application.Quit(); //退出項目
30 }
31 if (Input.GetKeyUp(KeyCode.Escape))//判斷當前按鍵是否為Android設備的Escape鍵
32 {
33 Application.Quit(); //退出項目
34 }}}
35 void OnGUI() //重寫OnGUI函數
36 {
37 float ratioScaleTempH=Screen.height/960.0f;//為了進行屏幕自適應而聲明的縱向縮放比變量
38 float ratioScaleTemp=Screen.width/540.0f;//為了進行屏幕自適應而聲明的橫向縮放比變量
39 //在自定義的屏幕位置繪制案例標題的紋理圖片
40 GUI.DrawTexture(new Rect(45*ratioScaleTemp,50*ratioScaleTempH,450*ratioScaleTemp,
41 100*ratioScaleTempH), anlibiaotiTexture, ScaleMode.ScaleToFit,true, 450.0f/100.0f);
42 if(GUI.Button(newRect(70*ratioScaleTemp,800*ratioScaleTempH,150*ratioScaleTemp,
43 80*ratioScaleTempH),quedingTexture,MyStyle)){//在自定義的屏幕位置//繪制一個確定按鈕,并判斷是否被按下
44 Application.LoadLevel("StartBall"); //若按下,跳轉到Start場景
45 Destroy(this); //并銷毀這個按鈕
46 }
47 //在自定義的屏幕位置繪制一個退出按鈕,并判斷是否被按下
48 if (GUI.Button(new Rect(320*ratioScaleTemp,800*ratioScaleTempH,150*ratioScaleTemp,
49 80*ratioScaleTempH),tuichuTexture,MyStyle)){
50 Application.Quit(); //若按下,退出項目
51 }}
52 void SetTex(string cubeName){ //聲明SetTex函數
53 switch(cubeName){
54 case "Cube1": //當觸摸到Cube1,修改Tex記錄為Tex1
55 PlayerPrefs.SetString("Tex","Tex1");
56 break;
57 case "Cube2": //當觸摸到Cube2,修改Tex記錄為Tex2
58 PlayerPrefs.SetString("Tex","Tex2");
59 break;
60 case "Cube3": //當觸摸到Cube3,修改Tex記錄為Tex3
61 PlayerPrefs.SetString("Tex","Tex3");
62 break;
63 case "Cube4": //當觸摸到Cube4,修改Tex記錄為Tex4
64 PlayerPrefs.SetString("Tex","Tex4");
65 break;
66 case "Cube5": //當觸摸到Cube5,修改Tex記錄為Tex5
67 PlayerPrefs.SetString("Tex","Tex5");
68 break;
69 case "Cube6": //當觸摸到Cube6,修改Tex記錄為Tex6
70 PlayerPrefs.SetString("Tex","Tex6");
71 break;
72 }}}
● 第4-9行的主要功能為變量聲明,在開發環境下的屬性查看器中可以為各個參數指定資源或者取值。
● 第10-12行為實現了Start方法的重寫,主要是在初始化時默認記錄第一個紋理圖。
● 第13-34行為實現了Update方法的重寫,主要為了判斷是否有Cube被觸摸,然后獲得觸摸的Cube名稱并記錄對應的紋理圖,以及給Android設備的按鍵添加控制方法。
● 第35-51行為實現了OnGUI方法的重寫,主要為了創建確定和退出按鈕,以及執行跳轉界面和退出項目的操作。
● 第 13-34 行為實現了定義一個 SetTex 方法,主要實現了根據立方體的名稱記錄相對應的紋理圖。
(2)立方體旋轉的實現,即創建一個名字為“RotateCube.cs”的腳本,分別掛載到 Cube1~Cube6,腳本“RotateCube.cs”的代碼如下。
代碼位置:見隨書光盤中源代碼/第3章目錄下的CubeBal /Assets/Script / RotateCube.cs。
1 using UnityEngine;
2 using System.Collections;//引入系統包
3 public class RotateCube : MonoBehaviour {
4 void Update () {//重寫Update函數
5 //如果沒有Cube被觸摸到同時本腳本掛在了Cube1上,Cube1就以較快的速度反向旋轉
6 if(!StartGame.isTouched && this.transform.name == "Cube1"){
7 this.transform.Rotate(-Time.deltaTime * 200,-Time.deltaTime * 200,-Time.deltaTime * 200);
8 }
9 //如果有Cube被觸摸到同時被觸摸到的Cube和本腳本掛載的Cube同名,被觸摸到的Cube
//就以較快的速度反向旋轉
10 if(StartGame.isTouched && this.transform.name == StartGame.touchedCube){
11 this.transform.Rotate(-Time.deltaTime * 200,-Time.deltaTime * 200,-Time.deltaTime * 200);
12 }
13 else{//其他情況下,立方體正常旋轉
14 this.transform.Rotate(Time.deltaTime * 50,Time.deltaTime * 50,Time.deltaTime * 50);
15 }}}
● 第4-15行是實現了Update方法的重寫,主要功能是為了控制各個立方體的旋轉速度,使被觸摸的立方體改變速度。
3.6.2 球走場景實現
本場景中的所有操作都與3.2.2小節所對應的操作相同,具體的操作步驟讀者可參考3.2.2小節所對應的部分,只是本場景中所使用的文件名有所改變,將中文改成了英文,再者就是將上一節中的“Init.js”腳本改成了“Init.cs”腳本,具體的腳本代碼如下所示。
代碼位置:見隨書光盤中源代碼/第3章目錄下的CubeBal /Assets/Script / Init.cs。
1 using UnityEngine;
2 using System.Collections;//引入系統包
3 public class Init : MonoBehaviour {
4 public Rigidbody ballTemplete;//球模板引用
5 public Texture fanhuiTexture;//返回按鈕紋理圖引用
6 public GUIStyle MyStyle;//自定義GUIStyle
7 void Start () {//重寫Start函數
8 Rigidbody ball;//新建實例球對象的引用
9 //在(0,0.7f,4.0f)位置實例化一個ball對象
10 ball=Instantiate(ballTemplete, new Vector3(0,0.7f,4.0f), ballTemplete.rotation) as Rigidbody;
11 string ballTex;//球紋理名引用
12 ballTex=PlayerPrefs.GetString("Tex");//獲得對應的紋理圖名稱
13 //將球的紋理設置成對應的紋理
14 ball.renderer.material.mainTexture = (Texture2D)Resources.Load(ballTex,typeof(Texture2D));
15 ball.velocity= new Vector3(-8,0,-15);//給球加一個初始速度
16 }
17 void Update () {//重寫Update函數
18 if (Application.platform == RuntimePlatform.Android)//判斷運行平臺是否為Android平臺
19 {
20 if (Input.GetKeyUp(KeyCode.Home) ) //判斷當前按鍵是否為Android設備的Home鍵
21 {
22 Application.Quit(); //退出項目
23 }
24 if (Input.GetKeyUp(KeyCode.Escape))//判斷當前按鍵是否為Android設備的Escape鍵
25 {
26 Application.Quit(); //退出項目
27 }}}
28 void OnGUI()
29 {
30 float ratioScaleTempH=Screen.height/960.0f;
31 float ratioScaleTemp=Screen.width/540.0f; //自適應屏幕時的長、寬縮放比
32 if (GUI.Button(new Rect(380*ratioScaleTemp,850*ratioScaleTempH,
33 150*ratioScaleTemp,80*ratioScaleTempH),fanhuiTexture,MyStyle)){
34 StartGame.isTouched = false;//返回到ChangeTex場景后恢復初始狀態
35 Application.LoadLevel("ChangeTex");//加載ChangeTex場景
36 }}}
● 第4-6行的主要功能為變量聲明,在開發環境下的屬性查看器中可以為各個參數指定資源或者取值。
● 第7-16行實現了的Start方法的重寫,在場景中實例化了一個球,并為球添加了紋理貼圖以及賦予了初速度。
● 第17-27行為實現了的Update方法的重寫,主要為了給Android設備的按鍵添加控制方法。
● 第28-36行為實現了的OnGUI方法的重寫,主要為了創建返回按鈕,執行跳轉界面的操作,以及聲明橫縱向縮放比變量,進而實現GUI組件的屏幕自適應特性。