2017-10-26 19:29:24 code_wrf 阅读数 258
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚

类图:

这里写图片描述

理解:

一条命令的周期为发布和接受(执行)。在Unity3D中,
调用者(Invoker)一般为控制器或者角色本身,得到客户端输入,调用具体的命令发布出去。
接受者(Receiver)(说成执行者可能更好理解),一般为角色本身,提供一些命令的具体执行方法。

在传统的Unity3D中,通过按键控制物体,一般是以
if(Input.GetKey(KeyCode.W)){
//向前移动的具体逻辑
}

上面的代码看似非常正常,但是这里的调用模块和执行模块高耦合,调用者需要关心者接受者的逻辑实现,执行者需要根据具体的调用来实现逻辑,两者过于相互依赖。如果那天需要修改向前移动的逻辑,或者更换向前移动的按键,需要直接修改上面的代码具体逻辑。违反了开闭原则。或者需要更换控制角色,则就需要更换脚本绑定。

命令模式主要的特点是把调用者和接受者之间的连接——命令——类化,把命令(Command)独立出来一个,成为一个单独的层用来连接调用者和接受者。然后调用者(Invoker)调用命令,命令通知接受者(Receiver)具体的执行逻辑

实际使用:

这里通过WSAD键控制Cube的前后左右移动的例子实现命令模式在Unity3D中的使用

ICommand.cs:

using UnityEngine;
using System.Collections;

public interface ICommand {

    void Execute(Receiver receiver);

}

命令接口(由于会存在多个不同的命令,这里将命令的公共部分写成接口),其中Receiver是接受者(执行者),用于调用接受者的具体执行方法
——————————————————————————————————————————————————————

MoveCommand.cs

using UnityEngine;
using System.Collections;

public class MoveForwardCommand : ICommand {

    public void Execute(Receiver receiver){
        receiver.MoveForward();
    }

}

public class MoveBackCommand : ICommand {

    public void Execute(Receiver receiver){
        receiver.MoveBack();
    }

}

public class MoveLeftCommand : ICommand {

    public void Execute(Receiver receiver){
        receiver.MoveLeft();
    }

}

public class MoveRightCommand : ICommand {

    public void Execute(Receiver receiver){
        receiver.MoveRight(); 
    }

}

4个具体的命令类,实现了ICommand接口。
——————————————————————————————————————————————————————
Receiver.cs:

using UnityEngine;
using System.Collections;

public class Receiver : MonoBehaviour {

    public float speed = 6f;

    CharacterController characterController;
    Vector3 moveDir = Vector3.zero;

    void Awake(){
        characterController = GetComponent<CharacterController>();
    }

    public void MoveForward(){
        moveDir = transform.TransformDirection(Vector3.forward) * speed; //将世界的正前方向量转化为物体的正前方向量
        characterController.Move(moveDir * Time.deltaTime);
    }

    public void MoveBack(){
        moveDir = transform.TransformDirection(Vector3.back) * speed;
        characterController.Move(moveDir * Time.deltaTime);
    }

    public void MoveRight(){
        moveDir = transform.TransformDirection(Vector3.right) * speed;
        characterController.Move(moveDir * Time.deltaTime);
    }

    public void MoveLeft(){
        moveDir = transform.TransformDirection(Vector3.left) * speed;
        characterController.Move(moveDir * Time.deltaTime);
    }

}

这里提供了具体的移动逻辑方法,这里通过CharacterController进行移动
——————————————————————————————————————————————————————

这里写图片描述

在Unity3D项目中创建一个Plane做背景,创建一个Cube和Sphere作为被控制移动的对象,GameController是一个空物体,用作控制移动脚本的载体。

这里写图片描述
给Cube和Sphere添加CharacterController组件和Receiver脚本

这里写图片描述
给GameController添加Invoker脚本

分别将Cube和Sphere拖给Invoker脚本的Receiver,分别运行,Receiver为Cube时,可以控制Cube移动,Receiver是Sphere时,可以控制Sphere移动。

总结

命令模式将调用模块和接受模块进行了很大程度的解耦,利于扩展。

学疏才浅,理解有限,欢迎指正不对之处,共同交流

2016-06-14 09:01:01 wenzhilu 阅读数 6899
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚


unity3D其实也有命令行参数,可能好多人并不知道。其实在unity游戏开发的时候命令行参数有时挺有用的,特别在做工具开发的时候。下面就是unity3d的一些命令行参数。

-batchmode
   在 批处理模式下运行Unity。应始终与其他命令行参数一起使用,因为它确保不会弹出窗口,无需任何人为的干预。当脚本代码在执行过程中发生异常,资源服务 器更新失败或其他操作失败时Unity将立即退出,并返回代码为1。请注意,在批处理模式下, Unity将向控制台发送输出版本最小的日志。当然,日志文件将包含完整的日志信息。
-quit
   其他命令执行完毕后将退出Unity编辑器。请注意,这可能会导致错误消息被隐藏(但他们将显示在Editor.log文件)
-buildWindowsPlayer <pathname>
   建立一个单独的Windows游戏(例如:-buildWindowsPlayer path/to/your/build.exe)
-buildOSXPlayer <pathname>   建立Mac游戏(例如:-buildOSXPlayer path/to/your/build.app)-importPackage <pathname>
   导入提供的package,不会显示导入对话框
-createProject <pathname>
   根据提供的路径建立一个空项目
-projectPath <pathname>
   打开指定路径的项目
-logFile <pathname>
   指定将要被写入编辑的log文件
-assetServerUpdate <IP[:port] projectName username password [r <revision>]>
   可 通过ip端口强制更新资源服务器的项目。端口是可选的,如果不是的话可以假定一个标准端口(10733)。最好使用此命令配合- projectpath参数确保你在正确的项目里工作。如果没有提供项目名字是那么就是最后一个Unity打开的项目。如果没有选择项目的路径则由- projectpath自动创建。
-exportPackage <exportAssetPath exportFileName>
   根 据路径导出package。exportAssetPath是一个文件夹(相对Unity项目的根目录)为了导出Unity项目并且 exportFileName是package的名称。目前,此选项只能在同一个时间导出整个文件夹。这个命令通常需要使用- projectpath参数
-nographics (Windows only)
   当运行在批处理模式,不会初始化显卡设备。这使得它可以在你的机器上自动按工作流程运行,甚至它没有GPU。
-executeMethod <ClassName.MethodName>
   在 Unity启动的同时会执行静态方法,该项目是开放的并且是在可选资源服务器更新完成之后。这可以用来不断的整合,进行单元测试,制作模型,准备一些数据 等。如果你想通过命令行返回一个错误,你可以抛出一个异常,会引发代码为1的Unity关闭或其他引发EditorApplication.Exit非零 代码。使用executeMethod,你需要在编辑文件夹有一个脚本并且类里有一个静态函数。
-batchmode
   在"headless"模式下运行游戏。游戏将不显示任何内容,或接受用户输入。这对运行网络游戏的服务器有很大的作用的。
-force-opengl (Windows only)
   让游戏使用OpenGL进行渲染,即使有可用的Direct3D。通常情况是使用Direct3D,但如果是Direct3D 9.0c的不可用的话则会选用OpenGL。
-single-instance (Windows only)
   在同一时候只允许一个游戏实例运行。如果另一个实例已在运行,然后再次通过 -single-instance启动它的话会调节到现有的这个实例。
-nolog (Windows only)
   不产生输出日志。 通常output_log.txt被写在游戏输出目录下的*_Data文件夹中 ,在debug.log中打印输出的地方。
-force-d3d9-ref (Windows only)
   使游戏运行在Direct3D的"Reference"软件渲染模式,必须要安装DirectX SDK才能使其工作。这主要是用于建立自动化测试对象,这样您可以确保不管是使用什么显卡,其渲染效果是完全一样的。
-adapter N (Windows only)
   允许游戏全屏运行在另一台显示器上,其中N表示显示的号码。
-popupwindow (Windows only)
   这个窗口将以弹出的方式创建(没有框架)


这么多命令行可以根据实际情况来使用,我自己是在写打包工具的时候使用的。
欢迎大家加入Unity技术交流群:3112035
2014-06-09 09:54:42 abv123456789 阅读数 5031
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚

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

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

【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
对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语言。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
C#(发音C Sharp),微软开发的面向对象编程语言。由于有强大的net类库支持,以及由此衍生出的很多跨平台语言,C#逐渐成为U3D开发者推崇的程序语言。U3D内置的脚本范例中,C#脚本也占了很大一部分(其他脚本是JavaScript脚本)。另外,在装有VisualStudio的电脑上,我们也可以使用微软的脚本编辑工具来编写U3D脚本。C开头,那么语法上和C语言是很接近的,除了面向对象语言所具有的一些特点。当然,我不用在这进行太多说明,因为C#的相关学习资料很多。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
BOO是新兴的基于Python的语言。语法上,BOO和Python大同小异,都是通过换行来实现语句的结束,它省略了分号、大括号,甚至条件语句的小括号等。Python在很多大型三维图形软件上都有应用,由此可以看出它的跨平台性能很不错,我也选择使用Python来编写maya特效脚本;不过,对于游戏事件的编写,个人感到这种精简的语法反而有些难以适应。如基本的变量类型定义,BOO(类Python)语法就显得不那么便捷:direction as vector3 =vector3(1,2,3)。游戏事件不同于特效脚本,前者是过程中的交互,而后者只需要看到结果。因此,游戏中经常需要大量的具有明确类型的变量出现,BOO语言可以省略变量类型的优势在这里反而容易引发问题。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
引擎编译时,三种语言的执行效率是一样的,因为U3D会内部进行它自己的语言格式的转换。尽管我们可以在不同语言编写的脚本之间进行变量和方法的调用,但是我不推荐那么做,因为测试确实会存在一些意想不到的问题。使用不同语言编写多个脚本时,应尽量让脚本之间没有直接联系。
最后,个人认为,在windows平台下,C#是U3D脚本语言的最佳选择。

【脚本的使用规则】
U3D的脚本作用方式很有趣,我称之为“拖放法”。无论是作用在一个具体的场景物体还是管理着批量的物体,脚本首先必须依附于场景中的一个元素才能被执行。要将脚本赋予物体的方式很简单,就是按住鼠标左键将脚本文件拖放到物体的属性面板上(也可以拖放到场景的物体上)。U3D有个概念,那就是component(成分)--类似Maya的节点。包括脚本,所有元素属性都是游戏物体的component。添加、删除、停用、读取、写入component信息,就是脚本所要做的(尽管脚本也是个component)。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
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内置的代码有个命名规则,开头第一个字母大写的词组都属于类或者函数,而开头小写的词组则是变量。新手经常会混淆它们之间的区别。简单说来,函数词组可以作为变量的类型,还可以直接执行功能,词组后必接成对小括号;变量是对应函数的分支,实现的是对一个具体属性的控制。例如:
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
Camera和camera。当场景中存在一个默认的主摄像机,脚本位于摄像机时,Camera.mainCamera.transform和camera.transform是等同的;假如脚本在其他物体上,Camera.mainCamera.transform仍旧直接获取了主摄像机,而camera.transform必须要使用Find函数先找到指定名称的摄像机:GameObject.Find("mainCamera").camera.transform。当然,这里是列出细节来比较,实际运用时,脚本位于特殊元素上我们可以不用声明这个元素的类别,如camera.transform可以简化到transform。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
GameObject和gameObject。前者包含查找,破坏和产生游戏物体的函数,同时可以将一个变量定义为“游戏物体”类型;后者则包含丰富的游戏物体属性,例如名称,变形信息,动画,渲染等。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
同上面列举的camera,对于直接作用于指定物体的脚本,gameObject也可以省略掉。不过,在开始学写代码时,书写完整的变量名能让我们更深刻的记忆每个属性和变量的关系。
通过以上对比后可以这么理解,函数通常是全局控制(包含脚本外的其他物体),而变量是需要指出具体的应用对象。
*如果书写代码时语句不在函数作用范围内,编译器将无法智能完成一些变量的全名显示。
更多函数的运用方法,用户可参考官方提供的帮助文档。

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

1.点击Hierarchy栏下的Create,创建一个Cube,Plane和Spotlight。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
2.在Assets目录下,创建文件夹(右键,Create->Folder),用于存放游戏的各种资源:模型,动画,材质,脚本,Prefab等。
3.双击进入myScript文件夹,创建一个C#脚本。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
4.给脚本命名,然后再双击开启脚本编辑工具(如果脚本名称和内部的类名称不同,一定要更正)。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
5.加入鼠标相关函数,这里我需要用到OnMouseOver,OnMouseExit,OnMouseDown。此类特殊函数不会有智能拼写出现。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
6.语法方面就不傻瓜式的一步步进行了,实现的思路是:
当鼠标移动到物体上,物体的材质色彩变为黄色,同时将一个初始值为假的布尔变量1的值取真;当鼠标离开后,物体材质色彩还原,布尔变量1值为假;当按下鼠标左键,且布尔变量1的值为真,布尔变量2的值为真。
*OnMouse函数都是执行一次的函数,因此不能将和动画有关的控制函数放于其内执行,通常会使用布尔开关来控制Update函数中的动画函数
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
7.接着在Update函数内实现:
当布尔变量2的值为真,物体旋转。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
8.将写好的脚本拖拽到场景中的方块上(或者先选择方块,将脚本拖到方块的属性栏),调好摄像机位置,执行测试;
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
9.因为脚本只作用于其所依附的物体,要控制灯光,我们有两个选择:创建新的脚本,使用查找物体函数。很显然,我没必要为这么简单的功能加入一个新的脚本。因此我使用Find函数获取灯光的强度属性。
*脚本中遇到这样一串长长的语句时,通常会使用一个自定义变量来替代,而且很多时候还能降低计算量。例如:
float LightInt =GameObject.Find("Spotlight").light.intensity。如果在Start函数中初始化,Update中就不必每帧执行查找函数,降低游戏效率。不过这里作为一个测试,我也就很省事的忽略了。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
10.GUI的使用。要在游戏视图显示各种UI信息,都需要使用U3D的UI组件或者GUI函数。为方便阅读,我将其他函数的内容收起,并使用GUI函数的Label创建简单的文字显示功能(有关GUI更多的详细信息,请参阅官方文档,我会在后面再做讨论)。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
11.最终测试:
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
12.发布。执行File->BuildSettings,开启发布界面。设置好要发布游戏的平台以及一些发布的信息,点击Build按钮即可发布一个完整的游戏客户端。U3D支持发布的平台与用户授权和操作系统有关,如IOS游戏需要MAC平台的U3D才能发布,Android需要在系统安装安卓SDK包,次世代主机平台则需要用户向官方购买额外解决方案。
【U3D】Unity3D的脚本-script入门 - WingOfStar☆ - WingOfStar☆的动漫小窝
*由于商业策略的分歧,U3D刚宣布了中止flash平台的后续开发,看来想玩U3D开发的网页游戏,还是需要先安装U3D官方的网页插件。

【结语】
游戏制作并不简单,这里仅仅是一个初入门的小例子,主要是对脚本使用方式的练习。后面会逐步深入学习U3D丰富的函数功能。
2015-04-20 18:08:35 qq_27503665 阅读数 255
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚

在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行。其执行顺序如下:

编辑器(Editor)

  • Reset:Reset函数被调用来初始化脚本属性当脚本第一次被附到对象上,并且在Reset命令被使用时也会调用。
    编者注:Reset是在用户点击Inspector面板上Reset按钮或者首次添加该组件时被调用。Reset最常用于在见识面板中给定一个默认值。

第一次场景加载(First Scene Load)
这些函数会在一个场景开始(场景中每个物体只调用一次)时被调用。

  • Awake:这个函数总是在任何Start()函数之前一个预设被实例化之后被调用,如果一个GameObject是非激活的(inactive),在启动期间Awake函数是不会被调用的直到它是活动的(active)。
  • OnEnable:只有在对象是激活(active)状态下才会被调用,这个函数只有在object被启用(enable)后才会调用。这会发生在一个MonoBehaviour实例被创建,例如当一个关卡被加载或者一个带有脚本组件的GameObject被实例化。

注意:当一个场景被添加到场景中,所有脚本上的Awake()和OnEable()函数将会被调用在Start()、Update()等它们中任何函数被调用之前。自然的,当一个物体在游戏过程中被实例化时这不能被强制执行。

第一帧更新之前(Before the first frame update)

  • Start:只要脚本实例被启用了Start()函数将会在Update()函数第一帧之前被调用。

对于那些被添加到场景中的物体,所有脚本上的Start()函数将会在它们中任何的Update()函数之前被调用,自然的,当一个物体在游戏过程中被实例化时这不能被强制执行。

在帧之间(In between frames)

  • OnApplicationPause:这个函数将会被调用在暂停被检测有效的在正常的帧更新之间的一帧的结束时。在OnApplicationPause被调用后将会有额外的一帧用来允许游戏显示显示图像表示在暂停状态下。

更新顺序(Update Order)

当你在跟踪游戏逻辑和状态,动画,相机位置等的时候,有几个不同的事件函数你可以使用。常见的模式是在Update()函数中执行大多数任务,但是也有其它的函数你可以使用。

  • FixedUpdate:FixedUpdate函数经常会比Update函数更频繁的被调用。它一帧会被调用多次,如果帧率低它可能不会在帧之间被调用,就算帧率是高的。所有的图形计算和更新在FixedUpdate之后会立即执行。当在FixedUpdate里执行移动计算,你并不需要Time.deltaTime乘以你的值,这是因为FixedUpdate是按真实时间,独立于帧率被调用的。
  • Update:Update每一帧都会被调用,对于帧更新它是主要的负荷函数。
  • LateUpdate:LateUpdate会在Update结束之后每一帧被调用,任何计算在Update里执行结束当LateUpdate开始时。LateUpdate常用为第三人称视角相机跟随。

渲染(Rendering)

  • OnPreCull:在相机剔除场景前被调用。剔除是取决于哪些物体对于摄像机是可见的,OnPreCull仅在剔除起作用之前被调用。
  • OnBecameVisible/OnBecameInvisible:当一个物体对任意摄像机变得可见/不可见时被调用。
  • OnPreRender:在摄像机开始渲染场景之前调用。
  • OnRenderObject:在指定场景渲染完成之后调用,你可以使用GL类或者Graphics.DrawMeshNow 来绘制自定义几何体在这里。
  • OnPostRender:在摄像机完成场景渲染之后调用。
  • OnRenderImage(Pro Only):在场景徐然完成之后允许屏幕图像后期处理调用。
  • OnGUI:为了响应GUI事件,每帧会被调用多次(一般最低两次)。布局Layout和Repaint事件会首先处理,接下来处理的是是通过
    Layout和键盘/鼠标事件对应的每个输入事件。
  • OnDrawGizmos:用于可视化的绘制一些小玩意在场景视图中。

协同程序(Coroutines)

正常的协同程序更新是在Update函数返回之后运行。一个协同程序是可以暂停执行(yield)直到给出的依从指令(YieldInstruction )完成,写成的不同运用:

  • yield:在所有的Update函数都已经被调用的下一帧该协程将持续执行。
  • yield WaitForSeconds:一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后。
  • yield WaitForFixedUpdate:所有脚本上的FixedUpdate函数已经执行调用之后持续。
  • yield WWW:在WWW下载完成之后持续。
  • yield StartCoroutine:协同程序链,将会等到MuFunc函数协程执行完成首先。

销毁(When the Object is Destroyed)

  • OnDestory:这个函数在会在一个对象销毁前一帧调用,会在所有帧更新一个对象存在的最后一帧之后执行,对象也许会响应Object.Destroy 或一个场景关闭时被销毁。

退出游戏(When Quitting)
这些函数会在你场景中所有的激活的物体上调用:

  • OnApplicationQuit:这个函数在应用退出之前的所有游戏物体上调用,在编辑器(Editor)模式中会在用户停止PlayMode时调用,在网页播放器(web player)中会在网页视图关闭时调用。
  • OnDisable:当行为变为非启用(disable)或非激活(inactive)时调用。

脚本的生命周期流程图

vital.png

2012-12-11 11:18:10 AnYuanLzh 阅读数 7126
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4714 人正在学习 去看看 张刚

FingerGestures最大的好处就是结合unity3d进行多点触控,手势识别,编写一次代码 ,通过配置来进行多平台发布

FingerGestures提供了3种不同的方法来检测由用户执行的拖动手势。

    • 每个手指的手势事件:为每个单独的手指,独立的状态
      • OnFingerTap                 轻敲
      • OnFingerDoubleTap
      • OnFingerSwipe               猛击
      • OnFingerLongPress           长按
      • OnFingerDragBegin,OnFingerDragMove,OnFingerDragEnd  拖曳
    • 全局手势事件:
      • 一个手指触摸屏幕上:
        • OnTAP
        • OnDoubleTap
        • OnSwipe
        • OnLongPress
        • OnDragBegin,OnDragMove,OnDragEnd
      • 两个手指触摸屏幕时:
        • OnPinchBegin,OnPinchMove,OnPinchEnd              捏,夹
        • OnRotationBegin,OnRotationMove,OnRotationEnd     旋转
        • OnTwoFingerTap
        • OnTwoFingerSwipe
        • OnTwoFingerLongPress
        • OnTwoFingerDragBegin,OnTwoFingerDragMove,OnTwoFingerDragEnd
  • 工具箱是一种更高级方便的方式,设计的理念是开箱就用,包括了很多脚本,但是没有涉及到核心源码,所以不用的话  可以把这个包直接删掉

FingerGestures  的事件注册是基于c#的,性能还是可以
unity3d FingerGestures 结构图 - 重庆unity3d - unity3d工作室
 FingerGestures is a scripting package forUnity that lets you easily detect and react to common input gesturesperformed with either a mouse or a touch screen device, using one or more fingers.
Main Features
  • Single and multi-finger gesture recognizers for Drag, Tap, Swipe, Long-Press, Pinch, Rotate
    单和多手指的拖曳、自来水、刷卡、长按、捏、旋转,等手势识别
  • Finger events: Down, Up, Move, Stationary
    手指事件:按下、弹起、移动、固定。
  • An easy and smooth integration with Unity’s workflow
    它能简单而平滑的与“unity的工作流式”整合
  • A straightforward and streamlined event-driven API to quickly get started without digging too deep
    这是一套简明合理的事件驱动API,无需深究就能快速上手
  • A rich and powerful object-oriented gesture framework for maximum control
    为最大的操控而提供的,一个丰富而强大的面向对象的手势框架
  • An efficient, low memory usage implementation
    一种高效,低内存占用的实施方案
  • Finger/Touch abstraction: mouse and touchscreen inputs go through the same pipe!
  • A Toolbox packed with no-coding-required & ready-to-use scripts including:
    手指/触摸抽象:鼠标和触摸屏输入,通过相同的管道!
  • Drag & drop system
    拖放系统
  • Smooth orbit camera using drag and pinch gestures to rotate, zoom and pan
    平滑的轨道相机使用通过:拖放和捏的手势来旋转、缩放和平移
  • Pinch-Zoom camera
    捏变焦相机

Several easy-to-follow sample scenes that will progressively introduce you to the libraryWorks on desktop, iOS and Android platformsSupport for both Javascript and C#Includes full C# source code with comments and online documentation
几个易于遵循的示例场景,将逐步向您介绍的这个库如何工作在:桌面、iOS和Android平台上。并支持同时JavaScript和C#。并包括完整的包含注释的C#源代码和在线文档。


来自:unity3d工作室http://cl314413.blog.163.com/blog/static/19050797620127292023453/

没有更多推荐了,返回首页