Unity3D的基本操作非常easy就能掌握了,接下来就是游戏系统的核心部分:脚本。
什么是Script(脚本)?简而言之,就是使用代码来运行一系列动作命令的特殊文本,它须要编译器来从新解读。U3D内部怎样解读脚本,这不是我们所要关心的—这是引擎开发者的活,我们所要知道的就是脚本的使用规则。

【三种语言的特点】
U3D支持C#,JavaScript,BOO三种语言格式的代码编写。首先来简介下这三种语言的特点:

对U3D来说,这是入门级的脚本语言,U3D内置的函数都能通过JS方便的调用。语法上,JS和传统的C语言差点儿相同,须要分号结束符,变量类型定义,大括号……只是它的变量类型定义,是通过冒号接在变量右边,如:Name:string=”Li”。相对其它两种语言,使用JS语法,非常多函数不须要实例化就能直接使用,如:

vector3 direction=vector3(1,2,3)。假设使用C#,则须要使用newkeyword:vector3 direction=new vector3(1,2,3)。JavaScript直接继承自U3D的MonoBehaviour类,因此不像C#和BOO那样须要使用Using或Import来载入类库。这看似省心,只是由于缺少了载入特殊类库,JavaScript能调用的第三方函数不多(当然,我们能够载入net类库给JavaScript调用,尽管看着有点奇怪……)。
*注意:JavaScript不是Java,同一时候,U3D中的JavaScript也有别于独立的JavaScript语言。
C#(发音C Sharp),微软开发的面向对象编程语言。由于有强大的net类库支持,以及由此衍生出的非常多跨平台语言,C#逐渐成为U3D开发人员推崇的程序语言。U3D内置的脚本范例中,C#脚本也占了非常大一部分(其它脚本是JavaScript脚本)。另外,在装有VisualStudio的电脑上,我们也能够使用微软的脚本编辑工具来编写U3D脚本。C开头,那么语法上和C语言是非常接近的,除了面向对象语言所具有的一些特点。当然,我不用在这进行太多说明,由于C#的相关学习资料非常多。
BOO是新兴的基于Python的语言。语法上,BOO和Python大同小异,都是通过换行来实现语句的结束,它省略了分号、大括号,甚至条件语句的小括号等。Python在非常多大型三维图形软件上都有应用,由此能够看出它的跨平台性能非常不错,我也选择使用Python来编写maya特效脚本;只是,对于游戏事件的编写,个人感到这样的精简的语法反而有些难以适应。如主要的变量类型定义,BOO(类Python)语法就显得不那么便捷:direction as vector3 =vector3(1,2,3)。游戏事件不同于特效脚本,前者是过程中的交互,而后者仅仅须要看到结果。因此,游戏中常常须要大量的具有明白类型的变量出现,BOO语言能够省略变量类型的优势在这里反而easy引发问题。
引擎编译时,三种语言的运行效率是一样的,由于U3D会内部进行它自己的语言格式的转换。虽然我们能够在不同语言编写的脚本之间进行变量和方法的调用,可是我不推荐那么做,由于測试确实会存在一些意想不到的问题。使用不同语言编写多个脚本时,应尽量让脚本之间没有直接联系。
最后,个人觉得,在windows平台下,C#是U3D脚本语言的最佳选择。

【脚本的使用规则】
U3D的脚本作用方式非常有趣,我称之为“拖放法”。不管是作用在一个详细的场景物体还是管理着批量的物体,脚本首先必须依附于场景中的一个元素才干被运行。要将脚本赋予物体的方式非常easy,就是按住鼠标左键将脚本文件拖放到物体的属性面板上(也能够拖放到场景的物体上)。U3D有个概念,那就是component(成分)--类似Maya的节点。包含脚本,全部元素属性都是游戏物体的component。加入、删除、停用、读取、写入component信息,就是脚本所要做的(虽然脚本也是个component)。
net语言的C#,在不同脚本之间调用变量和方法时,假设脚本位于同一路径下,那么仅仅须要对非static(静态)成员进行new实例化就可以。比如a.cs和b.cs,要调用脚本a中的一个非静态变量cc,须要在脚本b中写入:a  c=new a(),然后c.cc的格式完毕调用。只是,作为一个component,要调用不同脚本之间的成员,U3D的规则是使用GetComponent函数来完毕(事实上也就相当于new的作用,仅仅是U3D不支持这样的脚本间调用的写法)。如:
    someScript = GetComponent<ExampleScript>();
假设是在C#脚本中调用JavaScript脚本,则使用强制类型转换语法:
    someScript = GetComponent(“ExampleScript”) as ExampleScript ;
*<>这个特殊的符号表示使用的是C#中的泛型功能,用于避免强制类型的转换,降低装箱量(将值类型专为引用类型的操作)。

依据脚本使用的情况,能够有下面做法:
1.脚本位于同一个物体上。
可直接使用泛型或者类型转换语法调用。
如:someScript = GetComponent<ExampleScript>();
2.脚本位于不同物体上。
须要使用Find或相关的搜索函数,取得指定名称的物体信息后,再+”.GetComponent”函数。如:GameObject.Find("stone").GetComponent<ExampleScript>()。
3.脚本位于同一路径或者被调用脚本位于主脚本的路径及下面(脚本是否被物体使用都可)。
将被调用脚本中的成员(变量或方法)使用static标识,然后能够通过”脚本.成员”的格式直接调用。比如:
ScriptA.CS
public static mm();
ScriptB.CS
ScriptA.mm();
只是,static成员的调用尽管提高了效率,但由于它常驻内存,所以在会产生大量系统资源要求的情况下要慎用。
*static是C#定义变量或方法类型的keyword,使用static的变量或方法,不须要new实例化就可以直接调用。

【脚本内容】
除了JavaScript函数,C#和BOO的脚本都须要预先加载类库。这里以C#为例:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
}
NewBehaviourScript是脚本的名称,它必须和脚本文件的外部名称一致(假设不同,脚本无法在物体上被运行)。全部游戏运行语句,都包括在这个继承自MonoBehaviour类的自创脚本中(大括号内)。
下面介绍一些经常使用的内置执行函数(定义函数时,JavaScript的keyword是function,C#是void,BOO是def。如:void Start()。

Awake:在游戏执行时调用,用于初始化。
Start : 仅仅在游戏開始时运行一次,在Awake()函数后运行;
Update:在游戏每一帧都运行一次,在Start()函数后运行;
LateUpdate:同Update,仅仅是它会在Update()函数运行后再运行;
FixedUpdate:当游戏中引入刚体系统,使用适配的方式同步物理时钟,能够让动力学更精确的计算;
OnGUI:绘制游戏界面的函数,由于每一帧运行多次,所以一些时间相关的函数要尽量避免直接在其内部使用。
OnMouseOver:鼠标停留在物体上时运行该函数的内容。
OnMouseEnter:鼠标进入物体范围时运行该函数的内容。和OnMouseOver不同,该函数仅仅运行一次。
OnMouseExit:鼠标离开物体范围时运行该函数的内容。
OnMouseDown:鼠标按下时运行该函数的内容。
OnMouseUp:当鼠标释放时运行该函数的内容。
OnMouseDrag:按住鼠标拖动时运行该函数的内容。

OnMouse系列函数是针对指定物体的,假设要使用全局鼠标控制操作,则须要使用射线相关函数。还有非常多特殊的游戏触发事件的函数,这里就不一一列出。
U3D内置的代码有个命名规则,开头第一个字母大写的词组都属于类或者函数,而开头小写的词组则是变量。新手常常会混淆它们之间的差别。简单说来,函数词组能够作为变量的类型,还能够直接运行功能,词组后必接成对小括号;变量是相应函数的分支,实现的是对一个详细属性的控制。比如:
Camera和camera。当场景中存在一个默认的主摄像机,脚本位于摄像机时,Camera.mainCamera.transform和camera.transform是等同的;假如脚本在其它物体上,Camera.mainCamera.transform仍旧直接获取了主摄像机,而camera.transform必需要使用Find函数先找到指定名称的摄像机:GameObject.Find("mainCamera").camera.transform。当然,这里是列出细节来比較,实际运用时,脚本位于特殊元素上我们能够不用声明这个元素的类别,如camera.transform能够简化到transform。

GameObject和gameObject。前者包括查找,破坏和产生游戏物体的函数,同一时候能够将一个变量定义为“游戏物体”类型;后者则包括丰富的游戏物体属性,比如名称,变形信息,动画,渲染等。
同上面列举的camera,对于直接作用于指定物体的脚本,gameObject也能够省略掉。只是,在開始学写代码时,书写完整的变量名能让我们更深刻的记忆每一个属性和变量的关系。
通过以上对照后能够这么理解,函数一般是全局控制(包括脚本外的其它物体),而变量是须要指出详细的应用对象。
*假设书写代码时语句不在函数作用范围内,编译器将无法智能完毕一些变量的全名显示。
很多其它函数的运用方法,用户可參考官方提供的帮助文档。


【简单样例】
在一个箱子上按下鼠标左键,箱子就開始旋转,同一时候灯光被点亮,屏幕出现“Test”的字样。


1.点击Hierarchy栏下的Create,创建一个Cube,Plane和Spotlight。

2.在Assets文件夹下,创建文件夹(右键,Create->Folder),用于存放游戏的各种资源:模型,动画,材质,脚本,Prefab等。
3.双击进入myScript目录,创建一个C#脚本。

4.给脚本命名,然后再双击开启脚本编辑工具(假设脚本名称和内部的类名称不同,一定要更正)。

5.增加鼠标相关函数,这里我须要用到OnMouseOver,OnMouseExit,OnMouseDown。此类特殊函数不会有智能拼写出现。

6.语法方面就不傻瓜式的一步步进行了,实现的思路是:
当鼠标移动到物体上,物体的材质色彩变为黄色,同一时候将一个初始值为假的布尔变量1的值取真;当鼠标离开后,物体材质色彩还原,布尔变量1值为假;当按下鼠标左键,且布尔变量1的值为真,布尔变量2的值为真。
*OnMouse函数都是运行一次的函数,因此不能将和动画有关的控制函数放于其内运行,一般会使用布尔开关来控制Update函数中的动画函数。

7.接着在Update函数内实现:
当布尔变量2的值为真,物体旋转。

8.将写好的脚本拖拽到场景中的方块上(或者先选择方块,将脚本拖到方块的属性栏),调好摄像机位置,运行測试;

9.由于脚本仅仅作用于其所依附的物体,要控制灯光,我们有两个选择:创建新的脚本,使用查找物体函数。非常显然,我不是必需为这么简单的功能增加一个新的脚本。因此我使用Find函数获取灯光的强度属性。
*脚本中遇到这样一串长长的语句时,一般会使用一个自己定义变量来替代,并且非常多时候还能减少计算量。比如:
float LightInt =GameObject.Find("Spotlight").light.intensity。假设在Start函数中初始化,Update中就不必每帧运行查找函数,减少游戏效率。只是这里作为一个測试,我也就非常省事的忽略了。
10.GUI的使用。要在游戏视图显示各种UI信息,都须要使用U3D的UI组件或者GUI函数。为方便阅读,我将其它函数的内容收起,并使用GUI函数的Label创建简单的文字显示功能(有关GUI很多其它的具体信息,请參阅官方文档,我会在后面再做讨论)。

11.终于測试:
12.公布。运行File->BuildSettings,开启示布界面。设置好要公布游戏的平台以及一些公布的信息,点击Buildbutton就可以公布一个完整的游戏client。U3D支持公布的平台与用户授权和操作系统有关,如IOS游戏须要MAC平台的U3D才干公布,Android须要在系统安装安卓SDK包,次世代主机平台则须要用户向官方购买额外解决方式。
*因为商业策略的分歧,U3D刚宣布了中止flash平台的兴许开发,看来想玩U3D开发的网页游戏,还是须要先安装U3D官方的网页插件。


【结语】
游戏制作并不简单,这里不过一个初入门的小样例,主要是对脚本使用方式的练习。后面会逐步深入学习U3D丰富的函数功能。

U3D——Unity3D的脚本-script入门的更多相关文章

  1. Unity3D的脚本-script入门

    来自:http://blog.163.com/shininglore@126/blog/static/961841802013412101454833/ Unity3D的基本操作很容易就能掌握了,接下 ...

  2. Unity3d基础组件 (Component) 和脚本 (Script) 关系

    原版的:http://edu.china.unity3d.com/learning_document/getData?file=/Manual/TheComponent-ScriptRelations ...

  3. Unity3D大风暴之入门篇(海量教学视频版)

    智画互动开发团队 编   ISBN 978-7-121-22242-9 2014年2月出版 定价:79.00元 328页 16开 编辑推荐 长达800分钟的高清教学视频,手把手教会初学者 数个开发案例 ...

  4. Unity3D批处理脚本

    Unity3D批处理脚本 本文属于转载,如有侵权,请留言,我会及时删除! Max09在模型到处的模型和U3D场景的尺寸不一致,Max09中的1m导到U3D中,只有0.01m,这时可以在U3D中将模型的 ...

  5. 【转】Unity3D中脚本的执行顺序和编译顺序

    支持原文,原文请戳: Unity3D中脚本的执行顺序和编译顺序 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与脚本有关的也就是编译和执行啦 ...

  6. 《Unity3D大风暴之入门篇(海量教学视频版)》

    <Unity3D大风暴之入门篇(海量教学视频版)> 基本信息 作者: 智画互动开发团队 出版社:电子工业出版社 ISBN:9787121222429 上架时间:2014-1-13 出版日期 ...

  7. Shel脚本-初步入门之《02》

    Shel脚本-初步入门-什么是 Shell 脚本 2.什么是 Shell脚本 当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,改程序就被称为 Shell 脚本.如果在 Shell 脚本 ...

  8. shell脚本从入门到精通(初级)之入门篇

    写在开头 本文是阅读<Linux命令行与shell脚本编程大全>时的一些笔记,主要是shell脚本的一些基本语法, 还有很多细节和高级内容没有写到. 笔者也是shell script菜鸟, ...

  9. unity3d进行脚本资源打包加载

    原地址:http://www.cnblogs.com/hisiqi/p/3204752.html 本文记录如何通过unity3d进行脚本资源打包加载 1.创建TestDll.cs文件 public c ...

随机推荐

  1. docker学习笔记16:Dockerfile 指令 ADD 和 COPY介绍

    一.ADD指令 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中. 其格式是: ADD  源路径  目标路径 如: #test FROM ubunt ...

  2. 转:CSS选择器笔记

    作者: 阮一峰 日期: 2009年3月12日 去年我学jQuery的时候,曾经做过一点选择器(selector)的笔记. 这几天拿出来看了一下,发现很多都忘记了.所以,我决定把它们贴在这里,方便以后查 ...

  3. [cocos2d-x]针对不同的设备,选取不同的自适应图片

    前言: 我们在进行移动设备开发的时候,我们常常会准备不同大小的图片资源以适应不同大小的设备,下面我称普清图片资源和高清图片资源.那么如何做到图片资源的自适应呢?下面我来用一个demo展示一下这个效果的 ...

  4. CF(435D - Special Grid)dp

    题目链接:http://codeforces.com/problemset/problem/435/D 题意:求三角形个数,三个点必须的白点上,而且三条边必须是横线,竖线或对角线,三条边上不同意出现黑 ...

  5. Linux下tcpdump用法

    根据使用者的定义对网络上的数据包进行截获的包分析工具.tcpdump将网络中传送的数据包的“头”完全截获下来提供分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供了and. or.not等逻 ...

  6. QNX驱动开发——中断处理(转载)

    原文网址:http://blog.csdn.net/daniellee_ustb/article/details/7841894 在操作系统中,对于中断的处理一直是一件麻烦事,其实主要是对操作系统的中 ...

  7. 从头学Qt Quick系列

    http://www.cnblogs.com/csulennon/category/686605.html

  8. mybatis操作动态表+动态字段+存储过程

    存储过程 statementType="CALLABLE" <!-- 计算金额存储过程--> <update id="getCalcDistributo ...

  9. 面试题之——抽象类(abstract class)与接口(interface)的区别

    抽象类可以有构造方法,接口中不能有构造方法.(虽然抽象类有构造方法,但它也不能被实例化) 抽象类中可以有普通成员变量,接口中没有普通成员变量. 抽象类和接口中都可以包含静态成员变量.抽象类中的静态成员 ...

  10. webservice asmx 无法序列化接口 System.Collections.Generic.IList

    转载自:http://www.cnblogs.com/chenhuzi/p/4178194.html 今天有位同事在方法里加了一个IList<entity> 的返回值,也没有测试,直接发布 ...