Unity3D的基本操作很容易就能掌握了,接下来就是游戏系统的核心部分:脚本。
什么是Script(脚本)?简而言之,就是使用代码来执行一系列动作命令的特殊文本,它需要编译器来从新解读。U3D内部如何解读脚本,这不是我们所要关心的—这是引擎开发人员的活,我们所要知道的就是脚本的使用规则。
【三种语言的特点】
U3D支持C#,JavaScript,BOO三种语言格式的代码编写。首先来简单介绍下这三种语言的特点:
对U3D来说,这是入门级的脚本语言,U3D内置的函数都能通过JS方便的调用。语法上,JS和传统的C语言差不多,需要分号结束符,变量类型定义,大括号……不过它的变量类型定义,是通过冒号接在变量右边,如:Name:string=”Li”。相对其他两种语言,使用JS语法,很多函数不需要实例化就能直接使用,如:
vector3 direction=vector3(1,2,3)。如果使用C#,则需要使用new关键字: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语言可以省略变量类型的优势在这里反而容易引发问题。
引擎编译时,三种语言的执行效率是一样的,因为U3D会内部进行它自己的语言格式的转换。尽管我们可以在不同语言编写的脚本之间进行变量和方法的调用,但是我不推荐那么做,因为测试确实会存在一些意想不到的问题。使用不同语言编写多个脚本时,应尽量让脚本之间没有直接联系。
最后,个人认为,在windows平台下,C#是U3D脚本语言的最佳选择。
【脚本的使用规则】
U3D的脚本作用方式很有趣,我称之为“拖放法”。无论是作用在一个具体的场景物体还是管理着批量的物体,脚本首先必须依附于场景中的一个元素才能被执行。要将脚本赋予物体的方式很简单,就是按住鼠标左键将脚本文件拖放到物体的属性面板上(也可以拖放到场景的物体上)。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#定义变量或方法类型的关键字,使用static的变量或方法,不需要new实例化即可直接调用。
【脚本内容】
除了JavaScript函数,C#和BOO的脚本都需要预先载入类库。这里以C#为例:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
}
NewBehaviourScript是脚本的名称,它必须和脚本文件的外部名称一致(如果不同,脚本无法在物体上被执行)。所有游戏执行语句,都包含在这个继承自MonoBehaviour类的自创脚本中(大括号内)。
以下介绍一些常用的内置运行函数(定义函数时,JavaScript的关键字是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,开启发布界面。设置好要发布游戏的平台以及一些发布的信息,点击Build按钮即可发布一个完整的游戏客户端。U3D支持发布的平台与用户授权和操作系统有关,如IOS游戏需要MAC平台的U3D才能发布,Android需要在系统安装安卓SDK包,次世代主机平台则需要用户向官方购买额外解决方案。
*由于商业策略的分歧,U3D刚宣布了中止flash平台的后续开发,看来想玩U3D开发的网页游戏,还是需要先安装U3D官方的网页插件。
【结语】
游戏制作并不简单,这里仅仅是一个初入门的小例子,主要是对脚本使用方式的练习。后面会逐步深入学习U3D丰富的函数功能。
原文地址:http://blog.163.com/shininglore@126/blog/static/961841802013412101454833/

Unity3D的脚本-script入门相关推荐

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

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

  2. vb script html,VB script 入门

    这里简单介绍下vb script 脚本的基本语法: 后面可以参考这个例子: Sub 创建任务脚本_Click() Dim Line As String Dim ColumnStr As String ...

  3. Unity3d动画脚本 Animation Scripting

    Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理) 也许这一篇文章的内容有点枯燥,但我要说的是如果你想深入的了解游戏引擎是如何处理动画片断或者素材并 让 ...

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

    Unity3D大风暴之入门篇(海量教学视频版) 智画互动开发团队 编   ISBN 978-7-121-22242-9 2014年2月出版 定价:79.00元 328页 16开 编辑推荐 长达800分 ...

  5. Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言)

    http://www.lupaworld.com/action-viewstutorial-itemid-10105.html Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言) 文章来源于htt ...

  6. 【转】Lua脚本语言入门

    Lua脚本语言入门(目前魔兽使用的可以写在宏内的语言)(中文)-zt 作者: 沐枫 Lua 程序设计初步 作者: 沐枫 (第二人生成员) 版权所有转载请注明原出处 在这篇文章中,我想向大家介绍如何进行 ...

  7. python快速入门答案-总算懂得python脚本快速入门教程

    PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...

  8. 3D脚本 maxscript入门教程(6)

    3D脚本 maxscript入门教程(6) (2013-05-23 19:59:32) 转载▼ 标签: 建模 maxscript 3dmax it 分类: 脚本 * 这是伏羲先天八卦,乾1兑2离3震4 ...

  9. Shel脚本-初步入门之《03》

    Shel脚本-初步入门-Shell 脚本在 Linux 运维工作中的地位 3.Shell 脚本在 Linux 运维工作中的地位 Shell 脚本语言很适合用于处理纯文本类型的数据,而 Linux 系统 ...

最新文章

  1. centos7上的图形化界面svn客户端_Git实战一:图形客户端规范用法小讲
  2. python until语句_Python3 循环
  3. 杂谈:选择游戏还是应用?
  4. JZOJ 4.1 B组 删数
  5. [POJ3630] Phone List
  6. AtcoderGrandContest 005 F. Many Easy Problems
  7. [分享]运维分享一一阿里云linux系统mysql密码修改脚本
  8. CodeForces - 1303E Erase Subsequences(dp)
  9. Python 日期和时间戳的转换
  10. php5.4漏洞解决,php5.4.3的远程代码执行漏洞,提权挺管用
  11. VB 几种打开文本文件速度对比
  12. hadoop集群虚拟机配置
  13. HTML5 WebGame开源工具之impactjs
  14. linux命令行格式简介
  15. 互联网大脑进化简史,类脑智能巨系统产生与兴起
  16. 第1章 区块链是什么
  17. 微信 公众号 网页授权登录(静默授权)
  18. 把时间还给洞察,且看PPT调研报告自动生成攻略
  19. torch.cuda.amp.GradScaler(enabled=CFG.apex)是什么意思?
  20. Pyecharts亚马逊订单可视化

热门文章

  1. 实时体积云渲染(地平线):三.云体渲染
  2. 异步电动机matlab仿真实验报告,实验五, 三相异步电动机的MATLAB仿真
  3. 机械设计中的尺寸标注与测量
  4. win10 链接 ftp 错误
  5. Timus 1009. K-based Numbers
  6. Java获取target下的classes路径
  7. 开放封闭原则(SCP:Open-Closed Principle)
  8. BindingResult类的作用
  9. 微信公众号svg交互
  10. python写 艺术字(已验证)