使用C#编写游戏脚本
在前面提到,unity支持三种语言编写脚本:js,C#,boo。入门的时候建议只用js,因为js比较简单易懂,语法也不是很严格。但后来晋级的时候推荐使用C#,因为它比较符合unity的编程思想,执行效率更高。下面总结下怎么使用C#编写脚本。
继承MonoBehaviour类
在unity中,任何一个脚本,包括上述三种语言都需要去继承MonoBehaviour这个类。为什么我们之前写JS代码的时候没有继承咧?因为在创建JS代码的时候,系统会将其类名与继承关系隐藏起来。
在project视图中创建一个JS脚本,打开会发现如下代码:
#pragma strict function Start () { } function Update () { }
系统自动的帮我们生成Update方法。在JS中是不存在void类型的方法的,需要使用function作为关键字。
创建一个C#代码,打开后:
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
在C#脚本中,系统已经帮我们生成对应的继承关系public class NewBehaviourScript : MonoBehaviour
在绑定C#脚本时,必须保证它的名称与项目资源视图中该脚本名称对应,不然无法绑定。
声明变量
在JS中,声明变量都需要使用var关键字,并在变量后面添加“ :”以及具体对象类型与数值。C#则使用对象类型加变量名的方式。
JS:
public var i : int = 0;
var name : String[ ] = ["test","test1","test2"];
var obj : GameObject;
C#:
public int i = 0;
var String[ ]name = ["test","test1","test2"];
var GameObject obj ;
调用方法
在编写代码的时候调用方法是非常常见的,因为不可能所有的代码都写在同一个方法中,这样的代码是非常不合理且不应该。JS和C#在调用方法上也有不同:
JS
text01.js:
//整型 var i : int; //浮点型 var f : float; //布尔型 var b : bool ; //字符串 var str : string ; //设置整形 function setInt(int temp : int){ i = temp; } //设置浮点型 function setFloat(temp : float){ f = temp; } //设置布尔型 function setBoolean(temp : bool){ b = temp; } //设置字符串 function setString(temp : string){ str = temp; } //获取整形 function getInt() { return i; } //获取浮点型 function getFloat(){ return f; } //获取布尔型 function getBoolean() { return b; } //获取字符串 function getString() { return str; }
main,js:
var obj : GameObject; function Start(){ obj = GameObject.find("cube"); var script : text0 = obj.GetComponent("text0"); script.setInt(100); script.setFloat(10.0f); script.setBoolean(true); script.setString("test"); Debug.Log(script.getInt()); Debug.Log(script.getFloat()); Debug.Log(script.getBoolean()); Debug.Log(script.getString()); }
C#:
text01,cs.
using UnityEngine; using System.Collections; public class Test1 : MonoBehaviour { //整型 int i; //浮点型 float f; //布尔型 bool b; //字符串 string str; //设置整形 public void setInt(int temp){ i = temp; } //设置浮点型 public void setFloat(float temp){ f = temp; } //设置布尔型 public void setBoolean(bool temp){ b = temp; } //设置字符串 public void setString(string temp){ str = temp; } //获取整形 public int getInt() { return i; } //获取浮点型 public float getFloat(){ return f; } //获取布尔型 public bool getBoolean() { return b; } //获取字符串 public string getString() { return str; } }
main,cs:
using UnityEngine; using System.Collections; public class Main : MonoBehaviour { //立方体对象 GameObject obj ; // Use this for initialization void Start () { //获取立方体对象 obj = GameObject.Find("Cube"); //获取Test1脚本 Test1 script = obj.GetComponent<Test1>(); //设置整形 script.setInt(100); //设置浮点型 script.setFloat(10.0f);<pre name="code" class="javascript"> function OnGUI() { if(GUI.Button(Rect(100,50,200,100),"JavaScript调用C#")) { //获取C#脚本对象 var cs = this.GetComponent("CS_test"); //脚本C#脚本中方法 cs.CallMe("我来自JavaScript"); } } function CallMe(test : String) { Debug.Log(test); }
//设置布尔型script.setBoolean(true);//设置字符串script.setString("Test");//获取信息并且打印Debug.Log(script.getInt());Debug.Log(script.getFloat());Debug.Log(script.getBoolean());Debug.Log(script.getString());}}
其实细细品味下,JS和C#代码之间并没有非常大的变化,只是相关的关键字与格式有所不同而已。相信有JAVA学习的经验学习C#不是很难。记得老师曾经说过:计算机编程语言发展到现在,大部分的语言之间其实都是相互借鉴的,因此都是非常类似。只要你学好了里面的一种,其他的语言很容易就能上手。
JS与C#脚本之间的通信
在unity官方文档中,JS或者C#实现的脚本功能是完全相等的,不存在这个功能用JS实现比C#好这种说法。但在实际中,难免会遇见两种脚本来编写游戏。此时就需要他们之间进行通信了。
JS_test.js
function OnGUI() { if(GUI.Button(Rect(100,50,200,100),"JavaScript调用C#")) { //获取C#脚本对象 var cs = this.GetComponent("CS_test"); //脚本C#脚本中方法 cs.CallMe("我来自JavaScript"); } } function CallMe(test : String) { Debug.Log(test); }
CS_test.cs
using UnityEngine; using System.Collections; public class CS_test : MonoBehaviour { void OnGUI() { if(GUI.Button(new Rect(100,170,200,100),"C#调用JavaScript")) { //获取JavaScript脚本对象 JS_test jsScript = (JS_test)GetComponent("JS_test"); //调用JavaScript脚本中方法 jsScript.CallMe("我来自C#"); } } public void CallMe(string test) { Debug.Log(test); } }
运行:
点击后:
本例得注意一点,得将JS_test和CS_test都绑定在摄像机上,而且JS脚本得放在新建的Standard Assets文件夹中,否则无法编译。
【Unity 3D】学习笔记二十七:unity游戏脚本(七)