纳金网

标题: Unity3D中JavaScript与C#对比(二) [打印本页]

作者: yeu1233    时间: 2012-9-5 11:59
标题: Unity3D中JavaScript与C#对比(二)
本系列的第二节也会来给你解释一下JavaScript 和C#在Unity3D中编程有什么不同,建议你先看第一部分的内容。在这节中,我会给你解释一下如何访问GameObject和组件,这是一个程序员在编写Unity3D脚本时最常见的一个事。那么现在让我们先创建一个名称为“Pawn”的GameObject,并且给他附上“PawnMover”脚本。



    使用JavaScript来获取GameObject很简单,你只需要调用Find()静态方法,并把想要的GameObject的名称作为参数:
private var pawnGO:GameObject;  
function Awake(){     
     pawnGO = GameObject.Find("awn");
}  


用C#也很相似:
using UnityEngine;  
using System.Collections;   
public class PawnGetter : MonoBehaviour {      
private GameObject pawnGO;        
void Awake (){         
         pawnGO = GameObject.Find("awn");   
     }
}  
    在不考虑两种语言的关键字和格式不同的情况下,代码是完全一样的(第一个代码的第四行和第二个代码的第八行是相同的)。不管代码是强类型还是弱类型,GameObject.Find()方法总是会返回一个GameObject值。



    现在,让我们看看如何获得一个GameObject上的组件。假设“PawnMover”组件赋给“Pawn”GameObject,让我们来看看如何使用JavaScript获得“PawnMover”组件:
private var pawnGO:GameObject;  
private var pmSCawnMover;  
function Awake(){      
    pawnGO = GameObject.Find("awn");      
    pmSC = pawnGO.GetComponent("awnMover");  
}  


    基 本上,要获得“PawnMover”组件,我们所需要做的就是从“Pawn”GameObject调用GetComponent()方法,并把所需组件的名称作为参数。除了名称,我们也可以通过组件类型作为参数,但是像上面的例子我们用名字就行了。因为JavaScript是弱类型,返回值为组件,我们不需要把组件给PawnMover类作为结果。在C#中也是一样的:
using UnityEngine;  
using System.Collections;   
public class PawnGetter : MonoBehaviour  {      
private GameObject pawnGO;      
private PawnMover pmSC;        
void Awake(){         
    pawnGO = GameObject.Find("awn");  //returns a CS0266 error
    pmSC = pawnGO.GetComponent("awnMover");//<=returns a CS0266 error         
//this is the right way to do it when using C#        
    pmSC = pawnGO.GetComponent< PawnMover >();      
    }  
}  


    用 C#就不可能只是调用GetComponent()方法并把该组件的名称作为参数了,这样他会导致错误CS0266,也就是说C#不能从一个类型隐型转换 为另一个格式。因为C#属于强类型,我们不能把组件类型转换为PawnMover类型。我们需要调用一个方法传递这个类型,强制 GetComponent()方法返回“PawnMover”对象而不是组件。





    希望大家从这节中了解到一些有用的东西,下节将给大家讲解JavaScript和C#控制GameObject移动时有什么区别。




欢迎光临 纳金网 (http://rs.narkii.com/club/) Powered by Discuz! X2.5