官术网_书友最值得收藏!

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組件的屏幕自適應特性。

主站蜘蛛池模板: 土默特左旗| 七台河市| 额济纳旗| 冀州市| 两当县| 庐江县| 凤山市| 喀喇| 杭州市| 长泰县| 贺州市| 靖宇县| 盐亭县| 巫溪县| 梅州市| 浦县| 莱阳市| 阿拉善左旗| 蒙城县| 隆化县| 绿春县| 菏泽市| 三门峡市| 肇东市| 通辽市| 东光县| 奉节县| 彩票| 丹江口市| 沛县| 花莲市| 江都市| 古蔺县| 顺义区| 德阳市| 乐都县| 大埔县| 阿克陶县| 深圳市| 大理市| 密云县|