script unity3d_unity3d script - CSDN
  • Unity3D的基本操作很容易就能掌握了,接下来就是游戏系统的核心部分:脚本。 什么是Script(脚本)?简而言之,就是使用代码来执行一系列动作命令的特殊文本,它需要编译器来从新解读。U3D内部如何解读脚本,这...
    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丰富的函数功能。
    展开全文
  • 本文介绍了Unity3D界面及游戏对象基本操作。

    1 界面介绍

    在Windows等图形化操作系统上,熟练地使用菜单、图标、快捷键等,将会极大提升工作效率。因此,要认识一个软件,学会熟练使用他们,就必须先认识软件的界面。

    先点击菜单栏的Window——Layouts——2by3,设置成如下的界面,方便我们了解各个窗口。


    如下图所示,我们将各个区域分割出来,成为7个模块,逐一介绍主要的功能。这七个菜单分别是导航菜单栏、工具栏、场景视图、游戏视图、层次视图、项目视图、监测视图。


    (1)导航菜单栏

    Ÿ   File——场景的创建和保存、工程的创建和保存、程序的打包发布等等。

    Ÿ   Edit——包含一些复制、粘贴、删除、查找等基本编辑操作,还包含软件偏好设置(Preferences)和工程设置(Project Settings)等等。其中最常用的应该是偏好设置了。打开Preferences——External Tools,看到下面的视图。可以设置External Script Editor为自己喜欢的编辑器(例如,我就把内置的MonoDevelop改为了VisualStudio 2013了)。如果你需要发布程序到Android手机,那么你需要安装相应的模块,可以看到图中有Android设置。由于我已经安装了JDK和Android SDK,所以只需要将路径设置好就行了。对初学者来说,这还是有些复杂的,感兴趣可以找“Unity3D发布Android教程”来看看。当然,如果我们在学习初期只用到发布PC端程序,这些设置可以不用管它,保持系统默认就行了。


    Ÿ   Assets——创建、导入、导出素材等功能,一般情况下,Unity3D的外部插件都会通过导入unitypackage的方式来完成。

    Ÿ   GameObject——创建游戏对象以及一些对象属性的设置。

    Ÿ   Component——为游戏对象添加各种组件等。组件可以理解为一个个的小功能,对于一个游戏对象,如果添加了某个组件,它就具备了某种属性或者功能。

    Ÿ   Window——顾名思义,它是对界面的一些设置。

    Ÿ   Help——可以获取一些在线的帮助。

     

    (2)工具栏

    工具栏可以对放置于场景中的对象进行操作,如旋转、平移、缩放等。工具栏中间是游戏运行、暂停、按帧运行按钮。工具栏右侧是账户、显示层设置、窗口布局等。

    (3)场景视图

    场景视图是我们所创建和操作的空间。任何游戏物体都存在于场景中。场景视图是为我们开发者提供便利所设置的,我们可以从各个角度去观看游戏对象设置是否达到预期。场景视图中有很多可以设置的选项,例如2D-3D显示切换、灯光开关等。用到的时候再讨论即可。

    (4)游戏视图

    游戏视图是我们最终程序运行时所显示的画面,也是直接为用户呈现的画面。在我们开发过程中,它显示的是位于最高层级的camera所拍摄到的场景。

    (5)层次视图

    场景中的任何对象,名称都会显示在这个区域,这里可以清楚看出各个物体之间的联系,是分立关系还是父子关系(父物体可以影响子物体的运动)。也可以方便我们索引到场景中的任何对象。

    (6)项目视图

    资源文件在这里保存。我们也可以直接拖拽一些外部的资源(如图片等)到该区域中。这些资源文件都是保存在本地磁盘上的。

    (7)监测视图

    当选中某个游戏对象时,监测视图会显示它的组件,比如Transform等。


    2 游戏对象基本操作

    创建工程并创建场景后,我们就可以开始游戏开发了。不论你是不是要做一款游戏,我们姑且都叫做游戏开发吧。本质都是一样的。

    默认情况下,场景中已经有MainCamera和Directional Light等对象。我们现在以一个Cube为例来学习旋转、平移、缩放等基本操作。点击Hierarchy——Create——3D Object——Cube,就能创建一个立方体。

    当我们在场景视图中选中立方体,按下W,场景中的立方体就会如下所示。使用鼠标拖动这些带颜色的箭头就可以控制它的位置了。


    按下E,并拖动带颜色的圆环,可以控制物体旋转。


    按下R,拖动带颜色的方块,可以控制缩放。


    当然,在Inspector视图中还可以看到该立方体的Transform组件,设置Position、Rotation、Scale等值也可以改变立方体的位置、姿态和尺度。我们还看到立方体带有BoxCollider和MeshRenderer组件,后面都会讲到的。





    展开全文
  •  为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个...

    体系结构

       为了更好地理解游戏的软件架构和对象模型获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的它的主要原则

    Unity3D 引擎

       Unity3D的一个屡获殊荣的工具,用于创建交互式3D应用程序多个平台.Unity3D游戏引擎编辑器该引擎包含的软件组件游戏的研究与开发最常见的和经常性任务发动机涵盖的主题包括声音,图形,物理和网络功能该引擎支持C#Boo和JavaScript脚本编程

    另一个部分是Unity编辑,作为脚本和其他组件包含游戏场景设置和游戏预览窗口(见图4)分层对象检查项目面板集成开发环境它还配备了几个多语言脚本编辑器和一个独特的预制装配系统,将在后面解释

     

                                                              图4:Unity3D编辑

     

    有几个Unity许可证。Unity基本功能有限的免费PCMACWebdevelopment.Other平台完整的功能集[15]需要购买额外的许可证

    虽然有很多免费软件和专有替代游戏引擎虚幻引擎C4引擎选择了Unity的原因如下

    *可以部署在Windows,Mac OSXWeb浏览器,Wii游戏机iPhone,iPad的Android,微软Xbox 360和PlayStation 3它甚至在未来计划增加闪存Linux部署部署possbilities提供很多的可能性使用游戏引擎游戏引擎货币化进一步研究。

     *Unity社区非常支持引擎,以及编辑器是有据可查的

    *发动机是比较容易学习和工作通过提供所有的工具快速原型和迭代以及快速脚本编译支持快速软件开发的想法

    *可能部署的iPhone,iPad和iPod touch的iOS基本许可证其他厂商相比相对低廉的价格创建机甲坦克使用Unity3.0C#脚本和MonoDevelop的IDE进行开发你可以找到一个Unity教程附录

    Unity3D的简史

     下列日期说明2001和2011年[16]之间的Unity引擎的演变
     ◾2001年Unity技术在2001年开始开发自己的游戏引擎当时主要诱因创建游戏这些游戏的基础创造了良好的工具[1]。
     ◾2003在2003年公司,由此产生的引擎将是一个伟大产品本身的
     ◾2005在2005年Unity1推出苹果的WWDC的舞台上
     ◾2007Unity2.0在2007年推出增加地形引擎实时动态阴影和视频播放等等
     ◾2008在2008年推出UnityiPhone卡通网络推出FusionFall,游戏已经播放超过800万人次

     ◾20102010年Unity3.0发布几十个功能,如资产管理和光照贴图

     ◾2011团结超过500开发者和60网络播放器安装。

    游戏架构

     机甲坦克架构组成模块和Unity场景架构

     主要模块

        本节介绍了最重要的模块子系统级别他们关系。游戏的建筑风格是一个对象数据capsules.The下面的UML组件图说明子系统及其关系网络

     

    游戏逻辑

       此模块管理当前玩家AI配置倒计时timerand当前的游戏状态暂停等待网络回复

    AI(人工智能(Artificial Intelligence) ,英文缩写为AI

       AI模块包含背后的逻辑单元球员AI.The单位AI寻路或障碍物避免使用不同转向行为控制单元状态。AI管理组的行为和活动寻路更高的层次上管理播放机的所有播放器模块

    人工智能机器学习保存和加载它的数据使用持久性数据模块的接口

    Persistant data持久性数据

       此模块是负责数据之间不同的游戏sessions.Among其他应可用于保存和加载存储查找表和寻路模块管理学习AIaccumulateddata机器

    Game actors游戏参与者

      游戏参与者在游戏中地形,单位或建筑物他们的3D模型获得通过Unity3D的渲染管线的可视化每场比赛演员拥有AI模块控制它的行为

    Steering behaviours指导行为

      指行为计算力量,影响如何以及如何快速自主游戏代理能动,应该可以用于避障,人流简单寻找任务

    Pathfinding寻路

      模块负责创建一个pathgrid障碍物信息收集提供各种寻路请求aninterface为了获得更好的性能一些信息保存到从磁盘中加载

    Input输入

      此模块跟踪用户的输入对其进行处理生成反馈。

    Network网络

      网络模块负责所有游戏演员状态管理保持比赛状态在两台机器上都保持一致以避免抖动网络单元运动网络game.Another责任

    GUI

     图形用户界面(GUI)显示所有按钮,菜单在小地图倒数计时器它也负责这些元素的功能交互依赖用于此目的游戏逻辑模块

    3D渲染

      该模块主要管理Unity3D的场景的主摄像头确定需要渲染的对象并把它们发送通过渲染管线Unity3D的封装渲染细节而且还提供了通过像素和顶点着色器访问

    Unity场景设置

      在游戏中一个表示Unity3D的场景下面是一个典型的场景设置在Unity层次(一)(二)现场窗口看起来像

                                         

                                                                       Unity层次的地图

                

                                                                              场景视图的地图

    现在所有的游戏对象顶部面板底部进行说明。

    CWalls

      这个对象包含自定义绘制节点和墙壁边缘一种使用自定义绘制墙壁calculatethem取决于地图的几何

    Directional light(定向光)

      此灯仅用于计算地形光照贴图关闭之后由于性能的原因

    Game Music(游戏音乐)

      持有游戏的主要音乐和播放现场启动

    GameController(游戏控制器)

      GameController游戏物体持有管理所有的游戏对象管理游戏的逻辑包括以下对象

    CursorController(光标控制器):

       管理光标的外观和背后的逻辑

    GameInstantiator(游戏实例化):

       这个重要游戏对象负责实例其他对象需要创建非特异性顺序

                      

                                     GameInstantiator in the Inspector

                      

                                       GameController in the Hierarchy

      GameInstantiator持有地图PathCreator路径创建和管理障碍管理球员配置设置是用来处理用户输入InputControl游戏物体游戏场游戏物体和参考玩家游戏物体上的建筑物referenes定义了播放区域的地图

     它还包含玩家的重生点和自定义路径和墙壁引用

    GUI

      拥有地图的所有GUI对象

    Machine Learning Controller

       游戏物体控制的所有功能机器学习需要

    spawn1, spawn2

      实际玩家的重生点重生点的标志是绿色立方体“场景视图  

    HPaths

       定义路径节点在地图边缘定义节点场景编辑标记并概述红线     

    Main Camera(主摄像机)

       现场主摄像头和音频监听所有的3D声音相机的角度观察     

    PlayArea(游戏场)

      定义实际可玩的地图区域

    Base Prefabs(基地预制)

      散落在地图上的建筑物

    Terrain(地形)

       Unity地形对象

    TestRunner

      一个物体,用于运行单元测试Unity3D的单位testingframeworkSharpUnit

    MVC Pattern(MVC模式)

      Unity引擎的设计鼓励MVC模型 - 视图 -控制器面向engineering.In我的情况下结构看起来像这样

     

                                                                  图5:MVC模式体系结构表示

    模型包含了所有的游戏对象组件和数据文件游戏物体渲染器和摄像机对象访问

    视图呈现模型和主要管理Unity3D的引擎渲染它需要accessthe持有模型3D模型,纹理材质和效果它还具有什么输入选项影响

    控制器接收用户输入并调用模型对象方法反应这是在我的游戏中所表示输入子系统用户能影响输入视图

    Multiplatform Development(多平台发展)

      Unity允许部署项目在不同的平台上轻微变化。演示和功能在很大程度上是保持取决于平台的capabilities.However在某些领域在不同的设备上输入机制存在重大分歧

      抽象工厂设计模式应用于设计这些组件

    The Abstract Factory Pattern抽象工厂模式

                                 

                                                                                        图6:抽象工厂模式

    抽象工厂模式(见图6保护客户不同平台上实现相同的概念不同APC与平台是一家集AbstractProduct这些类表示一个概念,是支持所有抽象工厂platforms.An声明创建单一产品经营ConcreteFactory代表一个特定平台

    客户端只使用抽象工厂抽象产品方法,因此一个平台的具体实施保护

    Input and Persistant Data(输入和持久性数据)

       主要有两个方面的游戏不同的实施要求是输入机制和usageof持久性文件数据Unity3D中不支持plattform数据库这就是为什么机甲坦克使用持久性数据在磁盘上二进制文件所有平台得到了他们对于自己的能力自己实施支持的文件格式

     

    为了保持可读性和灵活性以下适应跨平台的输入处理抽象工厂模式

                  

                                                                         图7:输入子系统结构摘自

     

    这仅仅是一个所涉及的所有平台和命令,选择用于演示的摘录

    InputManager附加到游戏物体在场景中InputControl调用CommandImplementorExecute方法的每一帧里面的更新功能执行方法CommandImplementor遍历所有添加命令,检查他们执行情况表示满意,并调用Execute方法,如果是这样

     

    输入子系统组成部分的抽象工厂模式

                 

    iOS+Unity

         机甲坦克被创造的过程迭代开发,这是什么原因为什么游戏已经播放任何调整之前为iPad

         本章介绍分析面临的挑战和解决方案移植机甲和坦克的iPad

    Maximum Polygon Count(最高多边形计数)

         其中一个最明显的限制,适用于iPad™游戏的多边形数量的图形芯片能够呈现每个frame.It横空出世超过30多边形,每帧开始下降,低于25 FPS的帧率对iPad在3D建模软件通过手动消除边缘和应用预定义的算法减少多边形从一开始某些型号甚至rebuiilding减少多边形计数,目前在所有平台上多边形数量是:

                  

    平均多边形数量大约是每单位300如果所有的24个敌人和播放器单元的相机拍摄的在一帧中产生多边形的数量将是7200,平均约8500在最坏情况下24runners.Adding最大4000地形多边形平截头体的其余部分的地形得到扑杀,最重的将给予12500GPU多边形渲染

    Draw Call Reduction and Lights(绘制减少呼叫灯)


    即使在移动设备上不俗的表现,更重要的每帧绘制调用的数量一场平局发出呼叫GPU每次绘制一个模型如果模型有n子网格就会造成至少Ñ战平calls.EveryGUI质地,选择飞机和健康添加一个调用到现场

    额外抽奖调用另一个来源像素光照,导致额外绘图调用一个pass.That就是为什么合并成一个模型中所有子网型号不使用动态照明所有模型和地形纹理的灯光英寸光影烘烤计算每个纹理获取静态光源照亮奠定了光照贴图纹理的亮度看上去好像他们的灯光的影响虽然没有计算模型图8显示了几个模型,而无需光照贴图灯光效果

             

                                      图8:熄灭纹理材质着色器没有灯光烘烤模式截图

            

                                                                    9:游戏扩大统计窗口右上角视图

    这是可以结合Unity若干个对象共享相同的材料制成在运行时在一个单一的绘制调用的绘制在一起这种方法被称为动态配料[18]。图9显示了66战平调用以下来源所造成的一个场景

    (GUI)图形用户界面


    8绘制调用之缩小贴图按钮,,倒计时倒计时文本+24个+8号楼地图+1相机地图现货总结41GUI造成绘制调用

    Terrain(地形)


         4通话其中每个质地

    Visible Models(可见模型)

       14平局呼吁每个模型会导致比3战平调用自身的一个用于单元一个healthbar网格和一个用于选择平面网格数字都可以解释Unity的动态配料

    Terrains(地形)


         Unity3D中没有支持地形为iOS直到Unity3.4发布于2011年7月[19]。为了找到最佳的解决方案机甲坦克,地形实施两种可供选择的方式已经过测试模拟地形在3D程序一个3D建模程序地形分割成不同的部分见图10)分区的效果大部分分部视锥Unity扑杀meansthat只有至少部分可见得到呈现

                             

                                                                                图10:仿照地形突出部分

    这种技术被丢弃创造新的地形,因为这个过程会非常complicatedcompared Unity地形系统纹理大小非常大的质量受到影响*地形地形移动系统移动系统一个解决方案,通过Unity资产商店T4M地形可以用于移动设备可以转换成Unity的地形原来,这个解决方案的性能是不够游戏

    地形最终解决方案使用Unity地形引擎具有非常低的质量设置是唯一可能Unity3.4发布于2011年7月加入Unity地形对移动通信系统支持

    GUI-Optimization(GUI优化)


    Unity引擎提供两种方式来实现GUI一种方式是使用Unity的GUI系统UnityGUI需要它的功能一个特殊的功能calledinside名为OnGUI()执行每帧两次onceevery事件这个系统只用于主菜单,并暂停菜单allvalues​​需要计算OnGUI功能

    GUI纹理用于所有其他GUI元素GUI按钮和小地图上以维持性能GUI纹理平面图像中显示的2D和每帧渲染一次

    Script-Optimizations(脚本优化)


    为了授予脚本的性能便宜的方法进行跟踪profiler.It横空出世被称为最昂贵方法可以通过寻路转向行为子系统寻路已被优化如下文所述在AI部分有人还提出确保昂贵的功能,如转向行为和其他AI程序不会调用每一个帧

    展开全文
  • 今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游戏中人物的走动控制。...

            今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游戏中人物的走动控制。下面就请大家跟随我的一起来见证Unity3D强大的魅力吧。首先我们创建一个项目,创建新场景,我们首先创建一个Plane并将其命名为MainMap,然后我们在项目中添加一个Resources文件夹,将事先准备好的地图文件Map0复制到这个目录下,然后我们将这个图片拖拽到MainMap上,我们将MainMap的旋转参数Rotatiion设置为90,180,0,使其与摄像机垂直,然后将摄像机的Projection投影属性设置为 orthographic正交模式,这时我们就能够在屏幕中看到经典的余杭镇场景了。如果我们需要对场景进行进一步的优化的话,可以通过调整摄像机的投影面积大小和距离来实现。参数设置可以参考这里:



           接下来,我们再次创建一个Plane将其命名为Player,这就是我们今天要出场的角色李逍遥啦,和准备地图类似,我们将李逍遥的贴图直接拖拽到Player上。刚开始角色会比较大,和画面不协调,我们可以通过调整Scale参数来缩放我们的角色,调整到合适的范围。这里我们直接使用了一张完整的地图,在实际的游戏开发中,一个场景地图可能是由很多瓦片构成的,所谓瓦片,就是指被分割成若干个可以拼接起来的图片。我们知道,仙剑奇侠传作为一款经典的单机游戏,除了剧情以外,就是那些经典、动听的音乐啦,在Unity3D中实现音乐播放是很简单的事情,我们选定MainMap,为主场景添加一个AudioSource组件,并将背景音乐拖拽到AudioSource的AudioClip属性框中,选中Loop使其循环,接下来我们点击运行,运行效果如下图:


           接下类,就是今天的重头戏啦,我们今天的主要任务是通过Unity3D的2D帧动画绘制来实现人物的动画和控制,所以接下来我们在项目目录下增加一个Script文件下,新建一个叫做Person的脚本,该脚本封装了我们对人物角色的控制和帧动画的绘制方法。首先我们来准备一组素材:





               从名称的命名上,我们就可以看出这是角色在上下左右四个方向上的连续动画图片。下面,我们在Resources目录下创建下面的目录结构,并将上面的图片分别放在对应的文件夹下,我们在脚本中会引用下面的资源:


             下面开始编写脚本:

     

    using UnityEngine;
    using System.Collections;
    
    public class Person : MonoBehaviour {
    	//定义角色对象
    	private GameObject mHero;
    	//定义人物向上动画数组
    	private Object[] UpAnim;
    	//定义人物向下动画数组
    	private Object[] DownAnim;
    	//定义人物向左动画数组
    	private Object[] LeftAnim;
    	//定义人物向右动画数组
    	private Object[] RightAnim;
    	//当前帧索引
    	private int mFrameIndex;
    	//当前时间
    	private float mTotalTime;
    	//定义每秒帧数为10
    	private float mFPS=10;
    	//定义当前人物动画
    	private Object[] NowAnim;
    	private Object[] LastAnim;
    	//定义角色行动速度
    	private float mSpeed=5;
    	//角色当前状态
    	private PersonState mState=PersonState.Stand;
    	
    	//定义角色状态枚举
    	private enum PersonState
    	{
    	   Stand,
    	   Walk
    	}
    	
    	void OnGUI()
    	{
    	   GUI.Label(new Rect(10,10,180,40),"李逍遥位置:"+mHero.transform.position.ToString());
    	}
    	
    	void Start () 
    	{
    	   //获取人物
    	   mHero=GameObject.Find("Player");
    	   //获取动画数组
    	   UpAnim=Resources.LoadAll("UpAnim");
    	   DownAnim=Resources.LoadAll("DownAnim");
    	   LeftAnim=Resources.LoadAll("LeftAnim");
    	   RightAnim=Resources.LoadAll("RightAnim");
    	   //定义默认动画
    	   NowAnim=UpAnim;
    	   LastAnim=NowAnim;
    	}
    	
    	void FixedUpdate()
    	{
    	   //向左
    	   if(Input.GetKey(KeyCode.A))
    	   {
    	      SetAnimation(LeftAnim);
    	      this.mState=PersonState.Walk;
    	      mHero.transform.Translate(Vector3.right*Time.deltaTime*mSpeed);
    	   }
    	   //向右
    	   if(Input.GetKey(KeyCode.D))
    	   {
    	      SetAnimation(RightAnim);
    	      this.mState=PersonState.Walk;
    	      mHero.transform.Translate(Vector3.right*Time.deltaTime*(-mSpeed));
    	   }
    	   //向上
    	   if(Input.GetKey(KeyCode.W))
    	   {
    	      SetAnimation(UpAnim);
    	      this.mState=PersonState.Walk;
    	      mHero.transform.Translate(Vector3.forward*Time.deltaTime*(-mSpeed));
    	   }
    	   //向下
    	   if(Input.GetKey(KeyCode.S))
    	   {
    	      SetAnimation(DownAnim);
    	      this.mState=PersonState.Walk;
    	      mHero.transform.Translate(Vector3.forward*Time.deltaTime*mSpeed);
    	      Vector3 mHeroPos=mHero.transform.position;
    	   }
    	   DrawTexture(NowAnim);
    	}
    	
    	void Update () 
    	{
    	   //松开键位时
    	   if(Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D) 
    	   || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.W))
    	   {
    	      this.mState=PersonState.Stand;
    	   }
    	}
    	
    	void DrawTexture(Object[] mAnim)
    	{
    	   //如果角色当前状态为站立,则显示帧动画中的第一帧
    	   if(mState==PersonState.Stand)
    	   {
    	     mHero.renderer.material.mainTexture=(Texture)mAnim[0];
    	   }
    	   //否则绘制帧动画
    	   else
    	   {
    	      mTotalTime+=Time.deltaTime;
    	      if(mTotalTime>=1.0/mFPS)
    	      {
    	         mFrameIndex++;
    	         mTotalTime=0;
    	         if(mFrameIndex>=mAnim.Length)
    	         {
    	           mFrameIndex=0;
    	         }
    	      }
    	        mHero.renderer.material.mainTexture=(Texture)mAnim[mFrameIndex];
    	   }
    	}
    	
    	void SetAnimation(Object[] mAnim)
    	{
    	   NowAnim=mAnim;
    	   if(!LastAnim.Equals(NowAnim))
    	   {
    	      this.mFrameIndex=0;
    	      LastAnim=NowAnim;
    	   }
    	}
    }
    

             在上面的这部分脚本中,我们在Start()方法中加载了我们预先设定好的资源,然后在FixedUpdate()方法判断用户行为,并根据用户按下的键来确定要绘制的帧动画,我们假定每秒的帧数为10,则每帧显示的时间为0.1秒,如果从上一次刷新到现在的时间超过或者等于这个时间,则表示我们需要更新帧画面了。而当帧画面的索引和该帧动画数组内元素个数相等的时候,则意味着开始循环绘制这组帧动画。我们在上面定义了一个人物状态的枚举类型,这里只是简单的定义了两种类型,即Stand和Walk类型,当用户按下控制键时此类型的值为Walk,当用户松开控制键时此类型的值为Stand,和上一篇文章不同,这里调用的是 FixedUpdate()方法,而不是Update()方法,原因是Update()f方法更新的时间我们无法控制,而FixedUpdate()方法的时间则可以通过Edit->Project Setting->time->Fixed Timestep来指定,具体的大家可以自己阅读代码,这里就不多说了,剩下的事情就是把脚本绑定到Player上,我们运行一下:



             就目前这个解决方案而言,存在以下几个问题:

             1、人物范围控制,换句话说就是如何保证人物不会从这些房屋、篱笆上直接穿过去

             2、人物向下移动时,会钻到地底下

             3、摄像机如何跟随人物实现平移

             4、小地图的实现

              5、场景地图范围控制

              针对以上问题,伴随着博主学习Unity3D的深入,我们将在后面的文章中一一为大家解决,请大家关注我的博客,谢谢!


    展开全文
  •  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括声音,图
  • 今天呢,我们来说说Unity3D中的角色控制,这篇文章并非关注于Unity3D中的某项具体内容,而是博主在经过大量的实践后所得的感悟。今天的文章从内容上可以分为2种模式、1个组件、1种模型,希望对大家学习Unity3D起到...
  • 今天博主想和大家分享的是Unity3D场景编辑器的扩展开发,相关的话题我们在Unity3D游戏开发之编辑器扩展程序开发实例这篇文章中我们已经有所涉及,今天博主想特别针对场景编辑器的扩展开发来进行下深入研究。...
  • unity3D视景显示的数据传输通道建立matlab与unity3D传输数据matlab客户端建立unity3D服务器端建立简单版的开始了总结和可能的后续 matlab与unity3D传输数据 参考了很多代码,甚至有的一点都没有改,向各位大佬表示...
  • 很多人都会Unity3D中调用网页中的js,反过来就一头雾水。 其实也很简单 在HTML中添加下面的代码: var u = new UnityObject2(); u.initPlugin(jQuery("#unityPlayer")[0], "XXX.unity3d");//XXX为生成出来的...
  • Unity3D圣典-中文

    2020-07-30 23:31:51
    压缩包里包涵3个内容: 圣典中文用户手册、unity3d中文api和Unity3d_Script
  •  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括
  • Unity3d实战之Unity3d网络游戏实战篇(2):代码资源分离的界面系统 阅读文章前请细读以下几点: 学习书籍《Unity3d网络游戏实战》 罗培羽著 机械工业出版。 本文是作者在学习过程中遇到的认为值得记录的点,...
  • unity 3D云彩资源包3D Cloud Models(unity2017.4版本可能无法使用) Features: * 15 low polygon models: Duplicate, move, rotate, and scale the clouds in your scene to create epic skies and artistic ...
  • Unity3D的基本操作很容易就能掌握了,接下来就是游戏系统的核心部分:脚本。 什么是Script(脚本)?简而言之,就是使用代码来执行一系列动作命令的特殊文本,它需要编译器来从新解读。U3D内部如何解读脚本,这不是...
  • 今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们需要判断炮弹是否击中了敌人,在RPG游戏中我们需要判断玩家是否对敌人造成了...
  • 第一节:必备的基础知识 在做Unity 3D引擎数据交互问题之前,需要必备以下知识。1,您对Unity 3D要进行有针对性的了解,不要求您对Unity 3D有更深入的了解,在网上找些相关的介绍资料。比如:Unity 3D的脚本手册,...
  • [Unity3d]unity与html通信

    2019-07-26 09:54:06
    更多教程请访问: http://dingxiaowei.cn/ ...下面简单谈谈通过Unity3D调用HTML网页的脚本函数,以及通过HTML网页调用Unity3D中的脚本函数。 1.1Unity3D浏览器调用HTML网页中的函数 Unity3D浏览...
  • Unity3D 2018 3.0新手入门

    2020-02-01 15:58:47
    Unity3D新手入门 学习目的: 掌握Unity3D 常用的软件操作和一些基础脚本的使用 文章目录Unity3D新手入门1.1.1 Unity3D 介绍1.2 Unity3D 下载与安装2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20. 1. 1.1 Unity...
  • 体系结构 ... 为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎 Unity3D的是一个屡获殊荣的工具,...
  • Unity3D使用input类控制用户的输入,输入包括了用户键盘,鼠标,触摸,重力感应以及地理位置输入等输入方式。  本节我们介绍Unity3D中如何监听用户的鼠标、键盘输入。  首先我们介绍一个很重要的类KeyCode,此类...
1 2 3 4 5 ... 20
收藏数 8,764
精华内容 3,505
关键字:

script unity3d