Unity3D中JavaScript与C#对比
来源:互联网 发布:apache 泛解析配置 编辑:程序博客网 时间:2024/06/06 02:38
第一个也是最容易区分的一点就是声明变量和方法。
JavaScript的脚本:
1.
在C#中,同样的代码则会是:
1.
这对方法同样适用,在C#中,一个方法什么值也没有返回,那么他的返回值为 void 类型,但是在JavaScript中则可以省略。
类的继承也是不同的。在JavaScript和C#中,方法是隐型并且不可重载,除非方法声明中添加虚拟关键字。不同的是C#只重载那些包含重载关键字的方法。而JavaScript不需要关键词,只要重载类方法就可继承他们。我们来看一个JavaScript类继承的例子:
1.
2.
3.
4.
在C#中,同样的代码则会是:
1.
2.
3.
4.
这就是这两种代码的主要区别,实际上他需要定义全部的东西,像执行产出代码,访问GameObject和组件,激光投射等等。还有一些其他的不同点,比如导入函数库的关键字(在JavaScript中用“Import”,在C#中使用“using”),但是这些声明和关键字的不同就比较容易明白了。
1.
2.
3.
4.
======================================================
使用JavaScript来获取GameObject很简单,你只需要调用Find()静态方法,并把想要的GameObject的名称作为参数:
1.
2.
3.
4.
5.
用C#也很相似:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12. }
在不考虑两种语言的关键字和格式不同的情况下,代码是完全一样的(第一个代码的第四行和第二个代码的第八行是相同的)。不管代码是强类型还是弱类型,GameObject.Find()方法总是会返回一个GameObject值。
现在,让我们看看如何获得一个GameObject上的组件。假设“PawnMover”组件赋给“Pawn”GameObject,让我们来看看如何使用JavaScript获得“PawnMover”组件:
1.
2.
3.
4.
5.
6.
7.
基本上,要获得“PawnMover”组件,我们所需要做的就是从“Pawn”GameObject调用GetComponent()方法,并把所需组件的名称作为参数。除了名称,我们也可以通过组件类型作为参数,但是像上面的例子我们用名字就行了。因为JavaScript是弱类型,返回值为组件,我们不需要把组件给PawnMover
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17. }
用C#就不可能只是调用GetComponent()方法并把该组件的名称作为参数了,这样他会导致错误CS0266,也就是说C#不能从一个类型隐型转换为另一个格式。因为C#属于强类型,我们不能把组件类型转换为PawnMover类型。我们需要调用一个方法传递这个类型,强制GetComponent()方法返回“PawnMover”对象而不是组件。
======================================================
这系列第三节,解释JavaScript和C#在Unity3d游戏引擎中编程时有什么不同。建议你最好先去阅读第一和第二节,方便理解这节内容。
在第三节中,主要讲解用JavaScript和C#让一个GameObject向前移动有什么不同。现在我们来看一段使用JavaScript让一个GameObject向前移动的代码:
public
private
function
{
//get
}
//
function
{
//moves
goTransform.position.z
}
把这个脚本的目的是在每一个更新周期使goTransform的z轴坐标增加来控制让goTransform向前移动的,现在让我们看看用C#编写代码会是什么样的:
using
using
public
{
public
private
void
//
goTransform.Translate(Vector3.forward
}
这里我们可以看到,在C#中不能像JavaScript脚本中那样直接改变goTransform的z轴坐标值来移动,这样会产生CS1612error,因为我们是要改变一个值而不是引用该值。为了避免这个错误,在用C#编写脚本时,我们用方法移动GameObejct,比如Translate()、
=======================================================
private
private
function
{
}
//This
function
{
}
function
{
}
这个代码在屏幕上输出了两个文本,第一行会在开始不久就被渲染出来,第二行只会在暂停3秒后出现,yield代码只会执行一次,然后再正常执行Update()循环(也就是说不会再等三秒在去执行一次WaitThreeSeconds())。有一点要注意,我们知道能在函数内用yield,Update()方法是不能被暂停的。
现在来看看C#代码:
using
using
public
{
}
主要区别就是我们在C#中不能把yield放在函数中使用,需要使用IEnumerator接口,之所以这样只是因为C#就是这么设计的(关于IEnumerator接口的更多信息可以在http://www.devarticles.com/c/a/C-Sharp/Interface-IEnumerable-and-IEnumerator-in-C-sharp/2/这里找到)我们不能像调用普通函数那样调用WaitThreeSeconds(),即便那么做也不会有任何反应的。所以我们的解决办法就是想调用协同那样调用WaitThreeSeconds()。(例如14行)
另外一个区别就是在21行,我们要用yield return new WaitForSeconds(3)来替换
====================================================
先来看点儿基础知识:何为射线投射?顾名思义,就是用程序模拟了一个现实生活中被打出的一道射线(“Ray”,译者:O(∩_∩)O哈哈~我的名字)。在游戏编程中相当有用,Raycast类可以返回源点到射线碰撞某物体的距离(有的时候被用作得到碰撞物体的名称)。Unity3D没有单独的Raycast类,它是被Physics,
我来举一个用JavaScript投射射线的例子:
//Creates
private
//creates
private
//Get
private
function
{
//get
capsTrans
}
//
function
{
//recreate
ray
//Casts
if(Physics.Raycast(ray.origin,ray.direction,
{
//Collision
Debug.Log(hit.collider.name);
Debug.Log(hit.distance);
}
else
{
//the
Debug.Log("none")
}
}
来看看它是如何工作的:
首先,我们需要创建一个射线对象(Ray object),并且每帧都要重新创建一次(例如第2和20行),该射线类具备如光线投射的方向和来源等属性。
然后,我们需要一个RaycastHit类对象,获取射线与其他GameObject的碰撞发生时的距离和一些其他的详细信息。
接下来,我们需要从Physics类中调用Raycast()静态方法(例如23行),这个方法将实际的投射出一道射线,记录下射线源点、投射方向、RaycastHit
乍一听起来可能有些乱,但是多尝试几回就熟练了(更多信息请查看http://unity3d.com/support/documentation/ScriptReference/Physics.Raycast.html),接下来看看C#代码:
using
using
public
{
//Creates
private
//creates
private
//Get
private
void
{
//get
capsTrans
}
//
void
{
//recreate
ray
//Casts
if(Physics.Raycast(ray.origin,
{
//Collision
Debug.Log(hit.collider.name);
Debug.Log(hit.distance);
}
else
{
//the
Debug.Log("none")
}
}
}
当投射射线时,这两种编程语言之间唯一的区别在第28行代码上。现在来看看我们怎么Out关键词来传递hit对象呢?因为在C#中Raycast()方法需要RaycastHit参数做参考,这恰巧也是out关键词做的事情。所以我们用传递一个Raycast()的参考来代替传递对象(就好像我们在JavaScript中做的那样)。(更多信息请参考http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx)。
- Unity3D中JavaScript与C#对比
- Unity3D中JavaScript与C#对比
- Unity3D中JavaScript与C#对比
- Unity3D中JavaScript与C#对比
- unity3d中两种语言的对比JavaScript vs C#第一节
- Unity3d中两种语言的对比JavaScript vs C#第二节
- unity3d中两种语言的对比JavaScript vs C# 第三节
- unity3d中两种语言的对比JavaScript vs C# 第四节
- unity3d中两种语言的对比JavaScript vs C# 第五节
- [Unity3D]在Unity3D中Javascript的基本使用与介绍
- [Unity3D]在Unity3D中Javascript的基本使用与介绍
- C#中自定义消息,与MFc对比
- unity3d中C#构造函数与重载
- c#与vb对比
- c#语言与unity3D
- unity3d中C#枚举
- JavaScript ES6中const、let与var的对比详解
- Unity3D中Javascript的基本使用与介绍详解
- 4个经典案例:国外社交媒体是这样病毒性营销的
- SQLite 入门教程(二)创建、修改、删除表
- Android中Camera的调用流程
- 在Nhibernate中执行Oracle语句查询自动增长列数据
- 用ADO操作ORACLE的BLOB字段
- Unity3D中JavaScript与C#对比
- SQLite 入门教程(三)好多约束 Constraints
- GestureDetector.OnGestureListener 详解
- microtime()函数用法 及 计算脚本执行时间
- JS面向对象的写法
- 【转】JSTL标签用法:<c:choose><c:forEach><c:if><c:when><c:set>
- “盲点”问题一大箩
- 一个计算机爱好者的不完整回忆(二十四)最累的一次
- Java泛型与类型擦除