• 之前参考的两个教程虽然都不够全面,但是好歹帮助我对Unity3D有了初步的认识,快速实现了一些简单的小功能,培养了兴趣。人们都说,第一步往往是最困难的,因为你什么都不懂,遇到点问题就止步不前了,所以无论如何...

    嗯,没错,我又换教程了!之前参考的两个教程虽然都不够全面,但是好歹帮助我对Unity3D有了初步的认识,快速实现了一些简单的小功能,培养了兴趣。人们都说,第一步往往是最困难的,因为你什么都不懂,遇到点问题就止步不前了,所以无论如何我感谢两位作者。本文开始主要参考C语言中文网上的一个教程

    一、Unity认识再次补充

    ①Unity的地位和模型支持

    U3D是Unity Technologies公司开发的,功能全面丰富,跨各种主流平台,用途除了游戏还有很多:虚拟仿真教育、军事与航天、虚拟战场、室内设计、城市规划、工业仿真、文物古迹展示和保护等。据说,全球最赚钱的 1000 款手机游戏中,有 30% 是使用 Unity 3D 开发出来的。尤其在 VR 设备中,Unity 3D 游戏开发引擎具有统治地位。

    Unity3D支持各种模型格式,包括3ds Max、Maya、Blender等。

    ②Unity项目发布到PC平台的方法

    这个过程是非常简单的,首先点击菜单栏File->Build Settings,发现进入如下页面,按照图中的注释操作即可。
    在这里插入图片描述
    我进行了简单配置,发布了上一篇文章制作的游戏:
    在这里插入图片描述
    箭头所指就是游戏文件。

    ③Unity软件界面补充介绍

    (1)布局调整

    下图中两个红圈都可以调整成系统内置的布局,一个是在工具栏的,一个是在菜单栏的。一般推荐使用Wide或者2 by 3布局。
    在这里插入图片描述
    我们也可以自己调整布局,每个子窗口都是能拖动的。调整好后,可以在下图所示的位置保存我们自己的布局方式(下图红圈),有时软件会报布局异常,则点击下图中的方框位置即可解决。
    在这里插入图片描述
    (2)界面补充介绍
    我们以Wide布局为例,其各个视图的位置如下:
    在这里插入图片描述

    Unity中的游戏对象可以在各个视图中拖动,比如把Project中的Prefab拖到Hierarchy、Scene中,把Project中的脚本、动画拖到Inspector中,可以多加尝试。

    Hierarchy视图
    Scene中游戏对象的树状关系图,和Scene中的游戏对象一一对应。
    tips-1. 在Hierarchy的Scene、空白处、游戏对象上右击触发菜单,菜单的内容有所不同;
    tips-2. 当游戏对象很多时,可以用Hierarchy视图上侧的搜索框搜索我们需要的游戏对象,提高效率;
    tips-3. 按住alt键,点击Hierarchy中游戏对象左侧的小箭头,可以一次性递归地展开或者收起所有其子对象;
    tips-4. 点击加号符号等于空白处右键,点击竖排三点符号,则可以打开Hierarchy视图设置的菜单。

    Project视图
    对应Unity工程下的Assets文件夹,存放着游戏的所有资源,例如场景、脚本、三维模型、纹理、音频文件和预制组件等。建议所有操作都在Project中进行而不是去Windows的资源管理器中,比如添加一个图片我们直接拖到Project中即可,这样可以避免出现bug。
    tips-1. 下方的小滑块可调整图标显示的大小,调到最左侧即变为列表的形式;点击某个图标,滑块左侧的空白区域显示图标的相对路径(搜索出的内容点击它时则显示分层的搜索路径),图标区上方也会显示相对路径;
    tips-2. 搜索框和旁边的过滤搜索项按钮可帮助我们高效搜索,比Hierarchy中的搜索强大很多,此外各种菜单的触发类似Hierarchy视图;
    tips-3. 列表中的Favorites可以保存我们最常用的资源,直接把下方的Assets中的内容拖上来即可,也可在搜索后,点击搜索条旁边的星号,保存搜索结果到Favorites。

    Inspector视图
    游戏对象组件及组件编辑,主要是调整参数。
    在这里插入图片描述
    tips-1. Tag在编程时作用很大,用于区分物体;Layer把物体分成不同的层(比如水、UI、透明),在编程中用于区分不同的组,在设计中显示更清晰,即在软件工具栏中可以选择显示/屏蔽某些层:
    在这里插入图片描述
    tips-2. 很多组件的调整需要配合Scene视图,此时注意Shift键具有很多作用,比如一些参数的反向调节。

    Scene视图
    游戏场景/关卡可视化编辑。
    在这里插入图片描述
    tips-1. scene中物体的调节模式按钮对应键盘QWERTY键。
    tips-2. 绘图模式有如下几种:
    在这里插入图片描述
    Game视图
    游戏运行模拟窗口。
    在这里插入图片描述
    菜单栏和快捷键
    参考这里

    二、动态GUI和动态GameObject

    ①动态游戏对象

    U3D中创建游戏对象的方法有 3 种:
    第一种是将物体模型资源由 Project 视图直接拖曳到 Hierarchy 面板中;
    第二种是在 Unity 3D 菜单 GameObject 中创建 Unity 3D 自带的游戏对象,如 Cube、Camera、Light 等;
    第三种是利用脚本编程,动态创建或删除游戏对象。

    第三种是动态的,又有两个函数:CreatePrimitive用来创建内建的简单对象,Instantiate则可以创建prefab的实例。

    ②动态GUI

    在脚本中,void OnGUI()函数是用来绘制GUI的,每帧都会多次调用,我们可以在其中使用,如下语句创建GUI元素:

     void OnGUI()
     {
         if (GUILayout.Button("Instantiate", GUILayout.Height(50)))
         {
         // 按钮触发后的动作
         }
    

    ③小例子

    首先,再介绍下角色控制器:

    角色控制器主要用于第三人称或第一人称游戏主角控制,并不使用刚体物理效果。添加 Rigidbody 组件,取消选中 Use Gravity 复选框,选中 Is Kinematic 复选框使其不受物理影响,而是受脚本控制。

    角色控制器中的选项设置:
    在这里插入图片描述
    角色的移动还可以使用如下函数:

    // 获取角色控制器
    charactorController=this.GetComponent<CharacterController>();
    // 获取主相机
    mcam = Camera.main.transform;
    // 获取按键
    if(Input.GetKey(KeyCode.W)){}
    // 使用角色控制器提供的Move函数进行移动
    charactorController.Move(this.transform.TransformDirection(new Vector3(xm, ym, zm)));
    

    然后,我们开始设计一个带有按钮的程序,点击按钮动态生成对象:
    (1). 我们随便编辑一个游戏对象,拖入Project作为prefab,命名为MyObj;
    (2). 在Hierarchy中创建一个Cube;
    (3). 在Project中创建一个脚本:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class create_game_objects : MonoBehaviour
    {
        public GameObject myObj;                // prefab
    
        public GameObject cube;                 // cube对象
        public int transSpeed = 100;
        public float rotaSpeed = 10.5f;
        public float scale = 3;
    
        void OnGUI()                            // gui绘制和功能
        {
            // 以下每个if对应一个按钮
            if (GUILayout.Button("Instantiate", GUILayout.Height(50)))
            {   // 创建我们自制的prefab对象
                GameObject myobjins = Instantiate(myObj, transform.position, transform.rotation);
                myobjins.AddComponent<Rigidbody>();
                myobjins.GetComponent<Renderer>().material.color = Color.blue;
                myobjins.transform.position = new Vector3(0, 10, 0);
            }
            if (GUILayout.Button("CreatePrimitive-Cube", GUILayout.Height(50)))
            {   // 创建内建的cube
                GameObject m_cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                m_cube.AddComponent<Rigidbody>();
                m_cube.GetComponent<Renderer>().material.color = Color.blue;
                m_cube.transform.position = new Vector3(0, 10, 0);
            }
            if (GUILayout.Button("CreatePrimitive-Sphere", GUILayout.Height(50)))
            {   // 创建内建的sphere
                GameObject m_cube = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                m_cube.AddComponent<Rigidbody>();
                m_cube.GetComponent<Renderer>().material.color = Color.red;
                m_cube.transform.position = new Vector3(0, 10, 0);
            }
            if (GUILayout.Button("移动立方体", GUILayout.Height(50)))
            {   // 移动cube
                cube.transform.Translate(Vector3.forward * transSpeed * Time.deltaTime, Space.World);
            }
            if (GUILayout.Button("旋转立方体", GUILayout.Height(50)))
            {   // 旋转cube
                cube.transform.Rotate(Vector3.up * rotaSpeed, Space.World);
            }
            if (GUILayout.Button("缩放立方体", GUILayout.Height(50)))
            {   // 缩放cube
                cube.transform.localScale = new Vector3(scale, scale, scale);
            }
        }
    }
    
    

    (4). 把脚本拖给主像机,并给变量赋值:
    在这里插入图片描述
    (5). 效果
    在这里插入图片描述
    代码已经上传GitHub

    三、GUI系统

    Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI 等(早期的 Unity 3D 采用的是 OnGUI 系统,后来进展到了 NGUI 系统,在 Unity 4.6 以后 Unity 官方推出了新的 UGUI 系统,采用全新的独立坐标系,为游戏开发者提供了更高的运转效率),这些类型的图形系统内容十分丰富,包含游戏中通常使用到的按钮、图片、文本等控件。玩家在启动游戏的时候,首先看到的就是游戏的 GUI,其中包括贴图、按钮和高级控件等。

    ①OnGUI系统

    OnGUI 系统的可视化操作界面较少,大多数情况下需要开发人员通过代码实现控件的摆放以及功能的修改。

    开发人员需要通过给定坐标的方式对控件进行调整,规定屏幕左上角坐标为(0,0,0),并以像素为单位对控件进行定位。

    常用的控件有:
    在这里插入图片描述
    其中,BackgoundColor/Color、ToolTip、Skin比较特殊,别的都使用起来类似:

    Button:

    if(GUI.Button(new Rect(Screen.width/2-50, Screen.height/2+130, 70, 70),atnTexture)){ // 制定了button的位置和贴图
        Application.LoadLevel("play");
    }
    if(GUI.Button(new Rect(0, 0, 100, 50), "click here")){ // 制定了button的位置和文字
            print("you have click here!");
        }
    

    Backgound Color:

    void OnGUI(){ // 设置了button的背景色
        GUI.backgroundColor=Color.red;
        GUI.Button(new Rect(10, 110, 70, 30), "A button");
    }
    

    ToolTip:

        GUI.Box(new Rect(5, 35, 210, 175), new GUIContent("Box", "this box has a tooltip")); // box容器
        GUI.Button(new Rect(30, 85, 100, 20), "No tooltip here"); // 不带有tooltip的button
        GUI.Button(new Rect(30, 120, 100, 20), new GUIContent("I have a tooltip", "The button overrides the box")); // 带有tooltip的button
        GUI.Label(new Rect(10, 40, 100, 40), GUI.tooltip); // 把 tooltip 显示出来
    

    ②UGUI

    UGUI 系统有 3 个特点:灵活、快速、可视化,在 UGUI 中创建的所有 UI 控件都有一个 UI 控件特有的 Rect Transform 组件。在 Unity 3D 中创建的三维物体是 Transform,而 UI 控件的 Rect Transform 组件是UI控件的矩形方位,其中的 PosX、PosY、PosZ 指的是 UI 控件在相应轴上的偏移量。

    Canvas画布

    Canvas 是画布,是摆放所有 UI 元素的区域,在场景中创建的所有控件都会自动变为 Canvas 游戏对象的子对象,若场景中没有画布,在创建控件时会自动创建画布。

    画布创建后,系统都会自动创建一个名为 EventSystem 的游戏对象,上面挂载了若干与事件监听相关的组件可供设置。
    在这里插入图片描述
    Canvas具有三种Render Mode:
    所有像机:Screen Space-Overlay
    指定像机:Screen Space-Camera
    类似物体:World Space

    每个 Mode 还有一些设置参数,一个比较全面的说明如下:
    在这里插入图片描述
    Canvas Scaler和Graphic Raycaster中也有很多有意义的参数。

    Event System

    Event System 也是 GameObject,伴随着 Canvas 自动创建。

    其中重要的组件是 Input Module,自带一个 Standalone Input Module,这是用于 PC 单机的,还可以添加别的 Input Module。Input Module 封装了 Input 模块的调用,根据用户操作触发各 Event Trigger。

    自带组件介绍:

    1. Event System 事件处理组件
      是一种将基于输入的事件发送到应用程序中的对象,使用键盘、鼠标、触摸或自定义输入均可。
    2. Standalone Input Module(独立输入模块)
      用于鼠标、键盘和控制器。该模块被配置为查看 InputManager,基于输入 InputManager 管理器的状态发送事件。

    各种控件

    Panel、Text、Image、Raw Image、UGUI Button、UGUI Toggle、UGUI Slider、Scrollerbar、Input Field、Dropdown。

    Panel:
    Unity 3D panel 控件又叫面板,面板实际上就是一个容器,在其上可放置其他 UI 控件。一个功能完备的 UI 界面往往会使用多个 Panel 容器控件,而且一个面板里还可套用其他面板。当创建一个面板时,此面板会默认包含一个 Image 组件,其中,Source Image 用来设置面板的图像,Color 用来改变面板的颜色。

    如果想把控件放到面板中,需要把控件设置为面板的子对象。

    Text:
    在 Unity 3D UGUI 中创建的很多 UI 控件都有一个支持文本编辑的 Text 控件。Text 控件也称为标签,Text 区域用于输入将显示的文本。它可以设置字体、样式、字号等内容。
    在这里插入图片描述
    Image:
    Source Image 是要显示的源图像,要想把一个图片赋给 Image,需要把图片转换成精灵格式,转化后的精灵图片就可拖放到 Image 的 Source Image 中了。转换方法为:

    在 Project 视图中选中要转换的图片,然后在 Inspector 属性面板中,单击 Texture Type(纹理类型)右边的下拉列表,选中 Sprite(2D and UI)并单击下方的 Apply 按钮。

    Raw Image:
    Raw Image 控件类似于 Image 控件,但是,Raw Image 控件可以显示任何纹理,而 Image 只能显示一个精灵。

    Button:
    Button 是一个复合控件,其中还包含一个 Text 子控件,通过此子控件可设置 Button 上显示的文字的内容、字体、文字样式、文字大小、颜色等,与前面所讲的 Text 控件是一样的。

    复合控件在 Hierarchy 面板中会显示出其层次。

    Toggle:
    Toggle 控件也是一个复合型控件,如下图所示。它有 Background 与 Label 两个子控件,而 Background 控件中还有一个 Checkmark 子控件。Background 是一个图像控件,而其子控件 Checkmark 也是一个图像控件,其 Label 控件是一个文本框,通过改变它们所拥有的属性值,即可改变 Toggle 的外观,如颜色、字体等。

    此外还有 Dropdown、Slider、Scrollbar、Input Field,就不具体介绍了,需要时自行查看。

    此外,我们注意到,每个控件都有一个可以添加响应函数的区域,例如对于一个Button:
    在这里插入图片描述

    四、其它

    ①地形系统

    Unity 3D 有一套功能强大的地形编辑器,支持以笔刷方式精细地雕刻出山脉、峡谷、平原、盆地等地形,同时还包含了材质纹理、动植物等功能。场景涉及人物、地形以及各类型的建筑模型。大多数人物模型和建筑模型都是在 3ds Max、Maya 等专业的三维模型制作软件中做出来的。

    在 Unity 3D 中编辑地形有两种方法:一种是通过地形编辑器编辑地形,另一种是通过导入一幅预先渲染好的灰度图来快速地为地形建模。地形上每个点的高度被表示为一个矩阵中的一列值。这个矩阵可以用一个被称为高度图(heightmap)的灰度图来表示。灰度图是一种使用二维图形来表示三维的高度变化的图片。近黑色的、较暗的颜色表示较低的点,接近白色的、较亮的颜色表示较高的点。通常可以用 Photoshop 或其他三维软件导出灰度图,灰度图的格式为 RAW 格式,Unity 3D 可以支持 16 位的灰度图。

    在地形/Terrain/齿轮的如下区域可以导入地形:
    在这里插入图片描述
    使用 ps 可以把 geotiff 格式转换为 raw 格式。

    如果手动编辑地形,那么参考要点

    水的效果需要Unity基本资源包,这个在2019版本似乎无法导入了,可以想别的办法。雾和天空盒(Unity 3D 中的天空盒实际上是一种使用了特殊类型 Shader 的材质,这种类型的材质可以笼罩在整个场景之外,并根据材质中指定的纹理模拟出类似远景、天空等效果,使游戏场景看起来更加完整)的设置:
    在这里插入图片描述

    ②物理引擎

    游戏中物理引擎的作用是模拟当有外力作用到对象上时对象间的相互影响,比如赛车游戏中,驾驶员驾驶赛车和墙体发生碰撞,进而出现被反弹的效果。物理引擎在这里用来模拟真实的碰撞后效果。通过物理引擎,实现这些物体之间相互影响的效果是相当简单的。

    在 Unity 3D 内的 Physics Engine 引擎设计中,使用硬件加速的物理处理器 PhysX 专门负责物理方面的运算。因此,Unity 3D 的物理引擎速度较快,还可以减轻 CPU 的负担,现在很多游戏及开发引擎都选择 Physics Engine 来处理物理部分。在 Unity 3D 中,物理引擎是游戏设计中最为重要的步骤,主要包含刚体、碰撞、物理材质以及关节运动等。

    Rigidbody

    可以为游戏对象赋予物理属性,使游戏对象在物理系统的控制下接受推力与扭力,包括重力,从而实现现实世界中的运动效果。

    刚体是物理引擎中最基本的组件。通常把在外力作用下,物体的形状和大小(尺寸)保持不变,而且内部各部分相对位置保持恒定(没有形变)的理想物理模型称为刚体。在一个物理引擎中,刚体是非常重要的组件,通过刚体组件可以给物体添加一些常见的物理属性,如质量、摩擦力、碰撞参数等。

    Unity 3D 提供了多个实现接口,开发者可以通过更改这些参数来控制物体的各种物理状态。

    参数 含义 功能
    Mass 质量 物体的质量(任意单位)。建议一个物体的质量不要与其他物体 相差100倍
    Drag 阻力 当受力移动时物体受到的空气阻力。0表示没有空气阻力,极 大时使物体立即停止运动
    Angular Drag 角阻力 当受扭力旋转时物体受到的空气阻力。0表示没有空气阻力, 极大时使物体立即停止旋转
    Use Gravity 使用重力 该物体是否受重力影响,若激活,则物体受重力影响
    Is Kinematic 是否是运动学 游戏对象是否遵循运动学物理定律,若激活,该物体不再受物理 引擎驱动,而只能通过变换来操作。适用于模拟运动的平台或 者模拟由铰链关节连接的刚体
    Interpolate 插值 物体运动插值模式。当发现刚体运动时抖动,可以尝试下面的选项:None(无),不应用插值;Interpolate(内插值),基于上一帧变换来平滑本帧变换;Extrapolate(外插值),基于下一帧变换来平滑本帧变换
    Collision Detection 碰撞检测 碰撞检测模式。用于避免高速物体穿过其他物体却未触发碰撞。碰撞模式包括Discrete (不连续)、Continuous (连续)、 Continuous Dynamic (动态连续〉3种。其中,Discrete模式用来检测与场景中其他碰撞器或其他物体的碰撞;Continuous模式用来检测与动态碰撞器(刚体)的碰撞;Continuous Dynamic模式用来检测与连续模式和连续动态模式的物体的碰撞,适用于高速物体
    Constraints 约束 对刚体运动的约束。其中,Freeze Position(冻结位置),表示在世界中沿所选某个轴的移动将无效,Freeze Rotation(冻结旋转)表示刚体在世界中沿所选的X、Y、Z轴的旋转将无效

    Collider

    在 Unity 3D 的物理组件使用过程中,碰撞体需要与刚体一起添加到游戏对象上才能触发碰撞。值得注意的是,刚体一定要绑定在被碰撞的对象上才能产生碰撞效果,而碰撞体则不一定要绑定刚体。

    碰撞体需要和刚体一起来使碰撞发生,如果两个刚体撞在一起,物理引擎不会计算碰撞,除非它们包含一个碰撞体组件。没有碰撞体的刚体会在物理模拟中相互穿透。

    Collider的参数一般为:
    在这里插入图片描述

    一般游戏对象往往具有 Box Collider 属性,如墙壁、门、墙以及平台等,也可以用于布娃娃的角色躯干或者汽车等交通工具的外壳,当然最适合用在盒子或是箱子上。

    Mesh Collider(网格碰撞体)根据 Mesh 形状产生碰撞体,比起 Box Collider、Sphere Collider 和 Capsule Collider,Mesh Collider 更加精确,但会占用更多的系统资源。其参数为:
    在这里插入图片描述
    Wheel Collider(车轮碰撞体)是一种针对地面车辆的特殊碰撞体,自带碰撞侦测、轮胎物理现象和轮胎模型,专门用于处理轮胎。其参数为:
    在这里插入图片描述
    其余 Collider 就不介绍了。

    Trigger

    检测碰撞发生的方式有两种,一种是利用碰撞体,另一种则是利用触发器(Trigger)。触发器用来触发事件。Unity 3D 中的碰撞体和触发器的区别在于:碰撞体是触发器的载体,而触发器只是碰撞体的一个属性。

    如果既要检测到物体的接触又不想让碰撞检测影响物体移动,或者要检测一个物体是否经过空间中的某个区域,这时就可以用到触发器。

    当绑定了碰撞体的游戏对象进入触发器区域时,会运行触发器对象上的以下三个函数:

    MonoBehaviour.OnTriggerEnter(Collider collider);
    MonoBehaviour.OnTriggerExit(Collider collider);
    MonoBehaviour.OnTriggerStay(Collider collider);
    

    碰撞体和刚体的组合效果为(不使用重力,不使用动力学,Interpolate,Continuous Dynamic):

    物体1\物体2 None Collider Rigidbody Colider+Rigidbody
    None 穿透,OnMouseDrag失效 穿透,物体2可以OnMouseDrag,物体1不可以 穿透, OnMouseDrag失效 穿透,物体2可以OnMouseDrag,物体1不可以
    Collider 穿透,都可以OnMouseDrag 穿透,物体1可以OnMouseDrag,物体2不可以 物体1穿透2(低速且物体2原地不动),物体2无法穿透1,且1无物理效果,2有物理效果,都可以OnMouseDrag
    Rigidbody 穿透,OnMouseDrag失效 穿透,物体2可以OnMouseDrag,物体1不可以
    Colider+Rigidbody 全部可以

    总之,至少有两个Collider,至少一个有Rigidbody,就可以发生碰撞。如果不希望被撞跑,可以勾选Is Kinematic。想要正常碰撞,最好都添加Rigidbody,然后用Is Kinematic控制物理效果。

    物理材质

    物理材质是指物体表面材质,用于调整碰撞之后的物理效果。
    在这里插入图片描述

    AddForce函数

    Unity 3D 中通过 rigidbody.AddForce(x,y,z)方法添加力的作用,该方法的参数是施加力的方向,参数大小代表了力的大小。

    下面代码实现了,如果鼠标拖拽时,如果有Rigidbody就施加一个力,否则就拖动:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class mousedrag : MonoBehaviour
    {
        void OnMouseDrag()
        {
            if (this.gameObject.GetComponent<Rigidbody>() != null)
            {
                this.gameObject.GetComponent<Rigidbody>().AddForce(Input.GetAxis("Mouse X") * 5, Input.GetAxis("Mouse Y") * 5, 0);
            }
            else
            {
                transform.position += Vector3.right * Time.deltaTime * Input.GetAxis("Mouse X");
                transform.position += Vector3.up * Time.deltaTime * Input.GetAxis("Mouse Y");
            }
        }
    }
    

    CharacterController

    在 Unity 3D 中,游戏开发者可以通过角色控制器来控制角色的移动,角色控制器允许游戏开发者在受制于碰撞的情况下发生移动,而不用处理刚体。角色控制器不会受到力的影响,在游戏制作过程中,游戏开发者通常在任务模型上添加角色控制器组件进行模型的模拟运动。
    在这里插入图片描述
    角色控制器.Move(new Vector3(x, y, z))即可移动。

    Joint

    在 Unity 3D 中,物理引擎内置的关节组件能够使游戏对象模拟具有关节形式的连带运动。关节对象可以添加至多个游戏对象中,添加了关节的游戏对象将通过关节连接在一起并具有连带的物理效果。关节组件的使用必须依赖刚体组件。

    有 Hinge Joint,Fixed Joint,Spring Joint,Character Joint,Configurable Joint等多种。

    Cloth

    布料是 Unity 3D 中的一种特殊组件,它可以随意变换成各种形状,例如桌布、旗帜、窗帘等。Unity 3D 中的布料系统为游戏开发者提供了强大的交互功能。布料系统为游戏开发者提供了一个更快、更稳定的角色布料解决方法。

    Ray

    射线是三维世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。射线应用范围比较广,广泛应用于路径搜寻、AI逻辑和命令判断中。

    下面代码中,首先创建一个 Ray 对象,从摄像机发出到单击处的射线,然后输出射到物体的名字:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class camray : MonoBehaviour
    {
        void Update()
        {
            if (Input.GetMouseButton(0))
            {
                //从摄像机到单击处发出射线
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hitInfo;
                if (Physics.Raycast(ray, out hitInfo))
                {
                    //画出射线, 只有在Scene视图中才能看到
                    Debug.DrawLine(ray.origin, hitInfo.point);
                    GameObject gameObj = hitInfo.collider.gameObject;
                    Debug.Log("click object name is" + gameObj.name);
                    //当射线碰撞目标的标签是Pickup时, 执行拾取操作
                    if (gameObj.tag == "Pickup")
                    {
                        Debug.Log("pick up!");
                    }
                }
            }
        }
    }
    

    其中,out的用法参考:https://www.cnblogs.com/yuyexiaoxiao/p/11841183.html

    Physics Manager

    Unity 3D 集成开发环境作为一个优秀的游戏开发平台,提供了出色的管理模式,即物理管理器(Physics Manager)。物理管理器管理项目中物理效果的参数,如物体的重力、反弹力、速度和角速度等。

    在 Unity 3D 中执行 Edit→Project Settings→Physics 命令可以打开物理管理器。
    在这里插入图片描述
    物理引擎相关代码已经上传Gitbub

    ③动画

    主要介绍 Unity 3D 开发中的三维模型以及 Unity 3D 中的新版 Mecanim 动画系统。

    三维模型

    三维模型是用三维建模软件建造的立体模型,也是构成 Unity 3D 场景的基础元素。Unity 3D 几乎支持所有主流格式的三维模型,如 FBX 文件和 OBJ 文件等。

    主流的三维建模软件有:Autodesk 3D Studio Max,Autodesk Maya,Cinema 4D。

    动画系统

    Mecanim 动画系统是 Unity 公司推出的全新动画系统,具有重定向、可融合等诸多新特性,可以帮助程序设计人员通过和美工人员的配合快速设计出角色动画,Mecanim 动画系统提供了 5 个主要功能:

    • 通过不同的逻辑连接方式控制不同的身体部位运动的能力。
    • 将动画之间的复杂交互作用可视化地表现出来,是一个可视化的编程工具。
    • 针对人形角色的简单工作流以及动画的创建能力进行制作。
    • 具有能把动画从一个角色模型直接应用到另一个角色模型上的 Retargeting(动画重定向)功能。
    • 具有针对 Animation Clips 动画片段的简单工作流,针对动画片段以及它们之间的过渡和交互过程的预览能力,从而使设计师在编写游戏逻辑代码前就可以预览动画效果,可以使设计师能更快、更独立地完成工作。

    Mecanim 动画系统适合人形角色动画的制作,人形骨架是在游戏中普遍采用的一种骨架结构。Unity 3D 为其提供了一个特殊的工作流和一整套扩展的工具集。由于人形骨架在骨骼结构上的相似性,用户可以将动画效果从一个人形骨架映射到另一个人形骨架,从而实现动画重定向功能。

    创建模型动画的一个基本步骤就是建立一个从 Mecanim 动画系统的简化人形骨架到用户实际提供的骨架的映射,这种映射关系称为 Avatar。在导入一个角色动画模型之后,可以在 Import Settings 面板中的 Rig 选项下指定角色动画模型的动画类型,包括 Legacy(旧版动画类型)、Generic(一般动画类型) 以及 Humanoid(人形动画)3 种模式。

    要使用 Humanoid(人形动画),单击 Animation Type 右侧的下拉列表,选择 Humanoid,然后单击 Apply 按钮,Mecanim 动画系统会自动将用户所提供的骨架结构与系统内部自带的简易骨架进行匹配,如果匹配成功,Avatar Definition 下的 Configure 复选框会被选中,同时在 Assets 文件夹中,一个 Avatar 子资源会被添加到模型资源中。

    Unity 3D 中的 Avatar 是 Mecanim 动画系统中极为重要的模块,正确地设置 Avatar 非常重要。不管 Avatar 的自动创建过程是否成功,用户都需要到 Configure Avatar 界面中确认 Avatar 的有效性,即确认用户提供的骨骼结构与 Mecanim 预定义的骨骼结构已经正确地匹配起来,并已经处于 T 形姿态。

    动画主要依靠Animator 组件,以及Animator Controller,具体我们需要时再深入研究。现介绍其参数:
    在这里插入图片描述
    Animation组件也是用于动画的,但是它比较简单,其参数为:
    在这里插入图片描述
    关于两个动画组件的介绍见这里

    ④导航

    Navigation(导航)是用于实现动态物体自动寻路的一种技术,它将游戏场景中复杂的结构关系简化为带有一定信息的网格,并在这些网格的基础上通过一系列相应的计算来实现自动寻路。

    Unity 3D 不仅具有导航功能,还使用了导航网格(navigation meshes),这比手动放置节点更有效率而且更流畅。更重要的是,还可以一键重新计算整个导航网格,彻底摆脱了手动修改导航节点的复杂方法。

    这个就暂时不仔细研究了,可以参看这里

    展开全文
  • Unity3D基础知识、游戏算法一网打尽。
  • 即User Interface,用户在游戏中的操作界面,目前Unity中主要的UI系统有NGUI和UGUI,前者目前使用率较高,后者是Unity在4.6版本后自带的,版本较新,使用率渐增。 除了以上两种UI系统,还有极少使用的OnGUI和Legacy...

    1.UI

    即User Interface,用户在游戏中的操作界面,目前Unity中主要的UI系统有NGUI和UGUI,前者目前使用率较高,后者是Unity在4.6版本后自带的,版本较新,使用率渐增。

    除了以上两种UI系统,还有极少使用的OnGUI和Legacy GUI,前者可用于Unity引擎的界面拓展,后者使用极为简单,可快速实现一些简单的UI界面。

    UI界面可剖析为图片和文字的组合:

    文字:GUI Text

    旧版的UI文字系统,使用方法:

    首先创建一个空物体,然后为其添加组件:Component→Rendering→GUI Text

    Text栏输入想要显示的文字,Pixel Offset调整文字位置,Font和Color调整大小和颜色。

    注意:在Scene中是看不到文字的,只能在Game中面板中显示。

    如果在Game中无法显示文字,问题出在以下方面:

    1. 文字位置在摄像机视线之外。(要解决这个问题,先把空物体的位置重置,即x,y,z均为0,然后调节Pixel Offset的x,y范围在50到500以内,这是因为这个Pixel Offset是根据屏幕分辨率确定了,x表示与屏幕左侧距离多少像素,y表示与屏幕下侧距离多少像素,假如分辨率为1920×1080并要UI显示在左上角,可能x,y的取值分别为50,1050左右)

    2. 文字大小(Font)为零。

    3. 没有为主摄像机添加GUI Layer组件。(Component→Rendering→GUI Layer)

     

    图片:GUI Texture

    旧版的UI图片系统,使用方法:创建空物体,为其添加组件:Component→Rendering→GUI Texture

    Texture项就是我们要显示的图片,我们可以事先把图片放在Assets的Textures文件夹下。

    Color是图片颜色,默认的灰色不影响原图的颜色显示。

    Pixel Inset中的X、Y调整图片位置,W、H调整图片大小。

    该图片同样无法在Scene中看到。

     

    鼠标事件

    不同于之前使用的获取鼠标信息的方法,这里的鼠标事件是对于某个物体说的(而不是全局),编写鼠标事件的脚本是挂载在游戏物体上的,当鼠标移动到游戏物体上进行操作时,相应的鼠标事件才会触发。

    有以下鼠标事件方法:(它们与Start和update方法同级,写在这些方法之外)

    当鼠标移动到物体中时,OnMouseEnter方法触发,当鼠标移开,OnMouseExit触发,当鼠标在物体中且点下左键时,OnMouseDown触发,以上代码的作用是:

    将一张退出标志作为Texture,如果鼠标移动到退出标志,标志会变大,移开则变回原大小(原来的Scale均为0.5),点击会使程序退出。

     

    2.特效

    拖尾特效:Trail Renderer

    为子弹、流星等高速运动的物体作出尾迹的效果。

    创建尾迹:

    创建空物体,添加拖尾特效组件(Component→Effects→Trail Renderer)。

    创建完毕后在Scene中拖动空物体,即可看到粉红色的尾迹(此时没有为尾迹添加材质,默认为此种粉红色尾迹)

    添加尾迹材质:(注:因为软件版本原因,本人所看课程中的做法与下文不同,下文为本人认为较为正确的方式,若有错误还请指出)

    将做好的尾迹贴图放于Textures文件夹,创建材质球,设置其模式为:

                                        

    并设置Rendering Mode为Additive,Color Mode为Multiply,并将Textures中的尾迹贴图应用于Maps项,最后将设置好的材质球应用于尾迹中(Trail Renderer组件中的Materials项)。

    在该组件下,还可以调整尾迹持续时间(一般很小,0.2左右)、尾迹扩散方式(通过调整Width项的曲线)以及颜色。

    线特效:Line Renderer

    常用于射击游戏中红外线、激光等的表示。

    创建空物体,添加线特效组件(Component→Effects→Line Renderer)。

    然后与拖尾特效相同的方式添加材质球。

    与拖尾特效不同的是,需要设置线的起点和终点,此外还可以设置其颜色:

                            

     

    3.声音

    游戏中需要各种音效、背景音乐来配合,因此在Unity有音频编辑功能。

    在Assets中创建Audios文件夹存放音频。

    创建音频组件:创建空物体,添加Component→Audio→Audio Source,该音频组件在游戏中相当于一个喇叭,在Audio Clip中可设置要播放的音频。

    该组件还有一个属性:Spatial Blend,可将声音设置为2D或者3D,若声音为3D,则在游戏中距离该组件越远,声音越小,若是2D则音量不随距离而改变。

    有了喇叭还无法听到声音,还需要耳朵——Audio Listener,这个组件是默认挂载在摄像机上的,且没有属性可以设置。此外,上文提到的3D声音音量的变化,就是由“喇叭”与摄像机(Audio Listener)的距离所决定的。

    这里编辑一个脚本,用空格键控制声音的播放与暂停:

    private AudioSource musicPlay;
    bool f = false;
    
    void Start()
    {
        musicPlay = gameObject.GetComponent<AudioSource>();
    }
    
    void Update()
    {       
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (f)
            {
                musicPlay.Play();
                f = false;
            } else
            {
                musicPlay.Pause();
                f = true;
            }
        }
    }

    如果是想为游戏添加循环播放的背景音乐,可直接在Main Camera处添加,然后勾选Play On Awake和Loop即可。

     

    4.常用API

    1.游戏物体的实例化与销毁

    有时我们需要即时生成或销毁一些游戏物体,此时要用到以下方法:

    例如,在白色地板上,每按下以此空格,则随机生成一个红色方块:

    首先创建地板,然后创建红色方块并设置为预制体,接下来编写脚本:

    实际上实例化方法还可以进行赋值:

    public GameObject myBox;
    myBox = GameObject.Instantiate(box, position, Quaternion.identity) as GameObject;

    此处GameObject.Instantiate返回的是Object类型,而myBox是GameObject类型,所以要as GameObject进行强制转换。

    然后我们将该脚本挂载到游戏物体上,这里可以挂载在地板上:

    注意:这里还需要手动指定要实例化的预制体:要将perfabs文件夹中做好的预制体拖拽至上图的Box项。(注意:在定义预制体时一定要用public,否则此处无法拖拽)

    在实例化后还可以给这些物体不通过材质球而进行“上色”:

    myBox.GetComponent<MeshRenderer>().material.color = new Color(0.2f, 0.7f, 0.4f);

    物体的颜色由MeshRenderer组件确定,因此要通过这个组件下的方法来确定物体颜色,颜色由三个范围是[0, 1]的数组成,代表RGB。

    接下来是游戏物体的销毁,这个脚本需要挂载到预制体上:

    前一个参数为游戏物体,后一个参数为一个实数,代表实例化后多久销毁该物体(也可以不填,表示立即销毁)。

    2.Invoke函数

    是一个调用其他函数的函数(仅限同一脚本中),用法举例:每隔2秒自动生成一个游戏物体,直接在上面的CreateBox脚本中修改:

    首先将要反复使用的代码编写成函数,然后使用Invoke函数调用:

    Invoke(string, float),前一个为要执行的函数名称,后一个为多少秒后执行该函数。(因此调用函数时无法传递参数)

    InvokeRepeating(string, float, float),前一个为要执行的函数名称,后一个为多少秒后执行该函数,最后一个表示以后每隔多少秒执行该函数。然而,InvokeRepeating函数相当于一个开关,执行一次,之后每隔数秒就会重复执行,因此不能将该函数写在Update中。

    两种Invoke函数的区别是,前者只执行一次,后者执行无限次。

    注意:如上图所示,要调用的函数名应用双引号引起来,且没有括号。

    若要取消Invoke以及InvokeRepeating函数的重复调用,有:CancelInvoke()

    3.SendMessage函数

    gameObject.SendMessage(string):通知该游戏物体挂载的脚本文件中的某个方法执行(参数为方法名)。

    与Invoke不同,Sendmessage可以跨脚本调用函数,也可以带参数。

    用法举例:

    以下脚本实现的功能:控制方块WASD移动,在移动的时候使用GUIText显示其移动方向:

    挂载在GUIText的脚本:(为了之后可在别的脚本调用ShowDirection,要将其改成public形式)

    挂载在方块上的脚本:

    首先要调用游戏物体的组件,因为该脚本挂载的是方块,所以要用GameObject.Find方法来找到GUIText来挂载脚本中的Score组件。

    用法:某游戏物体.SendMessage,第一个参数为游戏物体挂载的脚本中要调用的函数名,如果要调用的函数只有一个参数,可直接接在后面,若有多个,则要转换成GameObject类型进行传递。也就是说,SendMessage的第二个参数是GameObject类型的,但如果要调用的函数参数只有一个,可直接写上该参数。

    更改如下:

    public GameObject obj;
    
    public void ShowDirection(object[] obj)
    {
        Score.text = obj[0]+obj[1].ToString();
    }
    object[] message = new object[2];
    message[0] = "上";
    message[1] = 2;
    Score.SendMessage("ShowDirection",message);

    4. 协同程序

    一般而言,脚本中的代码都是顺序执行的,但有时有些代码需要同时执行。除了多线程,在Unity中还可以使用协同程序来实现这一功能:

    如图所示,正常的执行顺序是1234,然而DelayNoMore函数采用了协同,因此程序的执行顺序是124,然后等待2秒执行3。

    IEnumerator是协同函数的返回值类型,yield return 这一行是协同函数的返回格式,同时实现了隔两秒执行3的功能。

    编写完协同程序,还需要StartCoroutine()来调用它(如果直接调用DelayNoMore,则函数内部代码将一直不会执行)

    在协同程序执行的时候,可使用StopCoroutine()命令停止协同程序,与StartCoroutine一样,括号中填入协同函数名。

    (实际上该方法有多个重载,这里先学习这一种)

    5. Screen屏幕类

    用于查看游戏屏幕的相关信息。

    Debug.Log(Screen.width + " " + Screen.height);

    可直接输出查看,Screen.width是屏幕宽度,Screen.height是长度,返回的是int型数值。

    在游戏编写中,输出值为Game窗口的尺寸,而在游戏打包发布后输出的就是实际运行窗口的尺寸。

    6. Time时间类

    Time.time,表示游戏运行到当前过去的时间(秒数)。

    Time.deltaTime,表示渲染完上一帧画面所用时间(秒数),可用于实现倒计时的效果。

    Time.timeScale,表示时间缩放,值为1时游戏正常运行,值为0时游戏暂停,值为0.5表示游戏慢放一倍。

    (实际上,即使更改了timeScale,Update的执行速度并不会受影响,它影响的是游戏中所有与时间有关的函数,例如游戏物体的自由落体)

    以上函数返回值均为float类型。

    7. Mathf数学类

    Mathf.Abs()  绝对值       Mathf.Max() 最大值       Mathf.Min() 最小值       Mathf.Round() 四舍五入

    重点:插值运算(可用于平滑过渡)

    Mathf.Lerp( float a, float b, float c),返回值为a+(b-a)*c,其中c的范围为[ 0, 1],超过1按1算,小于0按0算。

    如图,即可实现从0开始向10递增,递增速度会越来越慢,最后a会无限逼近10。

     

    5. 脚本生命周期

    C#脚本一般挂载在游戏物体上,当游戏物体被实例化后脚本的生命周期就开始了,直至游戏物体被销毁。

     脚本的生命周期以以下顺序进行:

    在脚本中这些函数都是默认编写好的,用户省略不写。此外,系统调用这些函数的顺序已定义好,与用户书写顺序无关。

     

    6. 物理射线

    1. 射线

    Unity 3D中自带一种类:射线,从一点发射出去并无限延伸,且可以与物体发生物理碰撞。首先看以下代码:

    private Ray ray;
    private RaycastHit hit;
    
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
            {
                GameObject.Destroy(hit.collider.gameObject);
            }
        }
    }

    Camera.main表示tag设置为MainCamera的摄像机组件的引用
    ScreenPointToRay(Vector3)为其下的一个方法,用于创建一条射线,从摄像机处发射至Vector3处。Input.mousePosition为鼠标当前位置,参数中填此可实现向鼠标点击处发射射线。

    接下来编写射线碰撞到游戏物体的效果:

    RaycastHit:一个结构体,用于存储射线的碰撞信息。

    Physics.Raycast(),有多种重载,脚本中所用的参数,前一个为射线,后一个为RaycastHit结构体(编写时一定要带out关键字),该方法的作用是:检测射线是否与其他游戏物体有物理碰撞,若有返回真,并将碰撞信息存入RaycastHit中。

    被射线碰撞到的游戏物体用GameObject.Destroy(hit.collider.gameObject)方法销毁。

    2. 子弹效果

    实现了上述功能,我们可以进一步作出子弹的效果:

    private Ray ray;
    private RaycastHit hit;
    public GameObject prefabBullet;
    private GameObject bullet;
    private Transform CameraTransform;
    
    void Start()
    {
        CameraTransform = gameObject.GetComponent<Transform>();
    }
    
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
            {
                bullet = GameObject.Instantiate(prefabBullet, CameraTransform.position, Quaternion.identity) as GameObject;
                Vector3 dir = hit.point - CameraTransform.position;
                bullet.GetComponent<Rigidbody>().AddForce(dir * 200);
            }
        }
    }

    在摄像机处实例化出子弹,然后朝向点击方向发射(AddForce),这个方向其实就是射线与物体碰撞处的坐标减去摄像机处的坐标。

    因此,要得到射线与物体碰撞处的坐标,可直接使用:RaycastHit.point

    脚本中有一个较为简单的写法来获取游戏物体的组件:直接对游戏物体GetComponent,不需要再额外定义游戏组件的接受对象。因此,CameraTransitform.position也可以写成:Camera.main.GetComponent<Transform>().position,这样Start就可以整个省却。

    另外,在测试以上代码时,我们可以看到射线的效果,但一直看不到射线本身,可通过:

    Debug.DrawRay(Vector3, Vector3, color)即可,第一个参数为射线起点位置,第二个为射线发射方向,最后为射线颜色。因此可在原脚本中加入:(注意:这个效果只能在Scene面板中看见)

    Debug.DrawRay(cameraPosition, dir, Color.red);

     

    7. 资源导入

    游戏编写需要大量的素材(音效、贴图、场景模型等等),在Unity 3D中这些资源若是独立于项目之外的(类似于扩充包),则会以.unitypackage的后缀名存储(类似于rar,zip)。

    若要导入这些资源包到当前项目中,可以鼠标选中其然后拖拽到Project面板,也可以在Assets文件夹中右键Import Package,选中Custom Package即可。

     同样的,若自己有整理好的资源包,也可右键Export Package导出。

     

    本文部分内容来自擅码网(http://www.mkcode.net)Unity 3D课程,经本人学习、整理得来,若有错漏,欢迎指正!

    展开全文
  •  为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名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-C#脚本

    2017-11-20 21:37:59
    生成的脚本中,生成的Start()方法,进行游戏初始化,只执行一次。Update()方法,会重复执行,可以监听用户动作或者游戏状态。 打印Log的两种方法:1.print(), 2.Debug.log(); -
    • 生成的脚本中,生成的Start()方法,进行游戏初始化,只执行一次。Update()方法,会重复执行,可以监听用户动作或者游戏状态。

    • 打印Log的两种方法:1.print(), 2.Debug.log();

    • 根据名称获取游戏对象: GameObject.Find(“objectName”)

      可以直接通过tansform.find("")获取本对象下的子对象。再通过GetComponent获取对象下的属性
      
    • 获取游戏对象中的游戏属性:GameObject.Find(“Image”).GetComponent();(需要先引入UI包,using UnityEngine.UI;)

    • 刚体间碰撞检测:

    //必须一个游戏对象属于刚体才能发生碰撞,参数是碰撞到的刚体
        //刚体和刚体间
        void OnCollisionEnter2D(Collision2D coll)
        {
            print("刚体间碰撞:"+coll.gameObject.name);
        }
    • 刚体和物体间碰撞检测,标示不同物体用Tag
      //必须一个游戏对象属于刚体才能发生碰撞,碰撞器属性一定是 isTrigger 才能发生碰撞 
        //刚体和物体碰撞
        void OnTriggerEnter2D(Collider2D c)
        {
            if (c.tag=="aaa")
            {
    
            }
            print("刚体和游戏物体aaa碰撞:"+c.gameObject.name);
        }
    • 获取用户键盘输入(例如按下A键):
    Input.GetKey(KeyCode.A) : GetKey:按下不放则一直触发
    Input.GetKeyDown() : 键盘按下的那一次才会触发。
    • 代码控制Animator中参数的值
    //定义一个Animator
    private Animator animator;
    
    void Start(){
        //获取Animator
        animator = GetComponent<Animator>();
    }
    
    void Update(){
        //修改参数的值
        animator.SetBool("name",true);
    }
    • 检测当前动画状态,判断动画是否完成
    //获取当前动画状态,用于判断动画是否结束
            AnimatorStateInfo info = animator.GetCurrentAnimatorStateInfo(0);
    
            //设置标志位
            if (info.normalizedTime > 1.0f && info.IsName(stateName))
            {
                animator.SetBool(parName, newState);
            }
    
    • 销毁对象
    Destroy(this.gameObject);
    • 生成一个对象
      可用于使用预制体发射子弹
    GameObject.Instantiate(bullet, transform.position, Quaternion.identity);
    • 屏幕坐标转化成世界坐标
    Vector3 tempPosition = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, Screen.height));
    • 移动游戏对象
    //将对象在坐标系中以某个方向移动
    transform.Translate(Vector3.up * speed * Time.deltaTime);
    //对象以某个速度运动。包括物理效果。
    rigidbody2d.velocity = new Vector2(0,speed);
    • 给刚体添加力
    rigidbody2d.AddForce(new Vector2(100, 0)); //向右施加力

    持续更新。。。

    展开全文
  •  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括声音,图

    体系结构

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

    Unity3D 引擎

       Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括声音,图形,物理和网络功能。该引擎支持C#,Boo,和JavaScript脚本编程。
    另一个部分是Unity编辑,作为脚本和其他组件,包含游戏场景设置和游戏的预览窗口(见图4)分层对象检查项目面板的集成开发环境。它还配备了几个多语言脚本编辑器和一个独特的预制装配系统,将在后面解释。

      

                                                              图4:Unity3D编辑器

    有几个Unity的许可证。Unity基本功能有限的免费PC的MAC和Web  development.Other 的平台或完整的功能集[15]需要购买额外的许可证。
    虽然有很多免费软件和专有的替代游戏引擎,如虚幻引擎™或C4™引擎选择了Unity的原因如下:
    *它可以部署在Windows,Mac  OSX ,Web浏览器,Wii游戏机,iPhone,iPad的,Android的,微软Xbox 360和PlayStation 3。它甚至在未来计划增加闪存和Linux部署。的的部署possbilities提供很多的可能性,使用的游戏引擎或游戏引擎货币化或进一步研究。

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

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

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

    Unity3D的简史

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

     ◾2010年在2010年Unity3.0发布了几十个新功能,如资产管理和兽光照贴图。

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

    游戏架构

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

      主要模块

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

    游戏逻辑

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

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

        AI模块包含背后的逻辑单元,组和球员AI.The单位的AI寻路或障碍物避免使用不同的转向行为控制单元的状态。组AI管理组的行为和活动,如组寻路。更高的层次上管理播放机的所有组由播放器模块。
    人工智能机器学习保存和加载它的数据使用的持久性数据模块的接口。

    Persistant data持久性数据

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

    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的的单位testingframework  SharpUnit 的。

    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。它调用CommandImplementor的Execute方法的每一帧里面的更新功能。执行方法的CommandImplementor遍历所有添加的命令,检查他们的执行情况表示满意,并调用Execute方法,如果是这样。

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

                  

    iOS+Unity

         机甲和坦克被创造的过程迭代开发,这是什么原因,为什么游戏已经播放任何调整之前为iPad™。
         本章介绍和分析面临的挑战和解决方案移植机甲和坦克的iPad™。

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

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

                   

    平均多边形数量大约是每单位300。如果所有的24个敌人和播放器单元的相机拍摄的,在一帧中产生的多边形的数量将是7200,平均约8500,在最坏情况下24  runners.Adding 最大4000地形的多边形(平截头体的其余部分的地形得到扑杀),最重的帧将给予约12500  GPU 多边形渲染。
    Draw Call Reduction and Lights(绘制减少呼叫和灯)
    即使在移动设备上不俗的表现,更重要的是每帧绘制调用的数量。一场平局发出呼叫的GPU每次绘制一个模型。如果模型有n子网格就会造成至少Ñ战平calls.Every  GUI 质地,选择飞机和健康栏添加一个调用到现场。
    额外抽奖调用另一个来源是每像素光照,导致额外的绘图调用每一个光pass.That就是为什么合并成一个模型中的所有子网和型号不使用动态照明。所有的模型和地形纹理的灯光烤英寸光影烘烤计算每个纹理获取静态光源照亮奠定了光照贴图在纹理的亮度。看上去好像他们的灯光的影响,虽然没有计算模型。图8显示了几个模型,而无需光照贴图或灯光效果。

              

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

             

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

    这是说,可以结合Unity若干个对象,共享相同的材料制成的,在运行时,在一个单一的绘制调用的绘制在一起。这种方法被称为动态配料[18]。图9显示了66战平调用以下来源所造成的一个场景:
    (GUI)图形用户界面
    8绘制调用之缩小贴图按钮,,倒计时倒计时文本的+24个图斑+8号楼地图斑+1相机地图现货。总结41  GUI 造成绘制调用。
    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程序不会调用每一个帧。

    转载自:http://blog.csdn.net/jbjwpzyl3611421/article/details/10441681

    ==================Unity3D引擎架构设计======================

    组件(Component)这个概念最早是在2005年《Game Programming Gems 5》的《Component Based Object Management》中接触到的,当时感觉在设计上很实用。后来,发现Unreal Engine 3的一个重要的改进就是抛弃了以前的基于纯派生关系的对象 模型 ,而转为使用 基于组件 的对象 模型 。对于这种设计思想,Unity比Unreal贯彻的更彻底——一切皆Component。

    那么到底什么是“基于组件”的对象 模型 ?它能够解决什么问题?

    在传统的设计中,我们一般会使用“派生”来描述对象之间的关系。子类通过派生父类,来获得父类的功能。在设计游戏对象时,会根据游戏本身的需要而为游戏对象添加各种功能支持,比如渲染,碰撞,刚体,粒子系统等等。这些通用功能为了能够为各种派生类提供服务,都必须实现到基类中。这样就导致了游戏对象基类变得非常庞大臃肿,即难使用,又难维护。

    ”基于组件“的对象 模型 就是把所有需要提供给游戏对象的基础功能都独立成单独的”组件模块“(Component),一个具体的游戏对象可以将它需要的功能模块组合到一起使用。所有”功能“不再是父类中的接口,而变成子对象实例,为游戏对象提供服务。这样既保证了功能代码的可重用性,又增加了整个对象体系的模块化和灵活度。

    在Unity中,GameObject除了作为Component的容器之外,基本上没有其他功能。所有需要的功能都要通过组合Component来实现。脚本本身也是Component,用来在GameObject上通过控制其他Component来实现自定义的功能。虽然这些Component在物理上是完全并列的关系,但是他们之间还是会有一定的层次关系的。在设计一个游戏对象的具体功能时,组件一般会被分为三个层次。

    引擎的基础组件

    Unity本身提供的各种内部功能组件。比如渲染组件,物理组件,声音组件等等。这些组件实现了所有引擎提供的基础功能,会被脚本使用来组合高级功能。

    模块功能脚本组件

    通过脚本实现的一些相对独立的通用模块功能的组件。这类 组件的设计 是脚本可重用的关键,需要仔细分析游戏对象中哪些功能可以被独立出来成为一个可重用的功能模块组件,并且在实现上应该尽量降低与其他组件的耦合性。比如在设计一个角色游戏对象时,需要为他设计换装功能。换装功能其实就是对显示子对象进行分组管理,切换显示状态。这个功能相对独立,与其将他实现到角色中,不如独立成一个功能模块组件。角色游戏对象和其他所有需要换装功能的游戏对象都可以通过包含这个模块组件来实现换装功能。

    模块功能组件之间还可能有依赖关系,也就是一个功能模块组件可能依赖与另一个功能模块组件,从而在这个组件层次上形成更多的子层次。

    高层的胶水代码脚本

    这些脚本用来真正将引擎基础组件和模块功能组件组合到一起实现最终游戏对象逻辑。用“胶水代码”来形容这些脚本非常的贴切,就是把所有这些子功能“粘”在一起。比如设计一个Player脚本,将所有需要的组件功能组合起来,实现一个玩家的具体游戏逻辑。因为这一层次代表的都是最高层的游戏行为控制对象,是具体的游戏逻辑的“胶水”代码,不会再为更上层提服务,所以本身的可重用性并不高。但是这些对象之间按照类型区分,往往会有一些功能上的重合,所以反而可以继续使用派生关系来实现功能的重用。比如在Character中实现所有的基础功能(这些功能又是通过组合基础组件来实现的),而Player和NPC都从Character派生,来继承所有Character的功能,并继续实现自己特殊的功能。一个功能到底应该用组件实现还是用派生实现并没有非常明确的界限,应该根据需要灵活运用。

    在使用Unity的过程中,如果要实现的是demo级别的小工程,并不需要考虑很多,直接用脚本实现功能就可以了。但是如果要有效地组织复杂的工程,提高代码的重用性,充分理解和合理的利用“基于组件”的对象 模型 设计思想还是很重要的。 

    展开全文
  • Unity3D常见面试题

    2017-08-11 20:20:00
    Unity3D常见面试题
  • 本章主要是 Unity3D 的基础快速入门篇,通过本章的学习,能让初学者们快速的掌握和 应用 Unity3D 软件。 本章导读 本章无论对于 Unity3D 初学者、或是以前从事建模工作的设计师、又或者是从事过 3D 编程的人群,...
  •  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括
  • unity3D-下载安装指南

    2020-02-17 20:20:28
    下载安装unity3D ​ 2.下载安装JavaJDK ​ 3.下载安装AndroidSDK ​ 4.下载安装NDK ​ 5.在unity3D中将2-4安装的地址在制定位置连接上[最重要的一步] ​ 6.3DMax下载安装 ​ 7.3DMax基本使用 ​ 8.3DMax 创建一个...
  • Unity3D】自学之路2.0

    2020-04-07 08:40:42
    一、前言 原文主要讲的是如何从零基础入门,然后一步一步进阶的文章,包括很多学习资料,学习的网址,研究方向等,内容还是比较全面的。大家多多支持一些克森大神,关注一下他的公众号。这篇文章就将原文的内容...
  • 为了让开发者能够系统全面的学习Unity3D知识,CSDN特定邀请了Unity3D方面的知名专家,资深程序员一起打造了Unity3D知识库,经过各位特邀编辑的层层筛选,目前已收录的核心知识点精华文章已达300多篇,包括...
  • unity3D物体旋转

    2019-11-06 21:14:03
    在3D世界里,物体有位置和姿态信息,位置很好理解,就是在空间中的坐标,有绝对坐标(position,世界坐标)和相对坐标(localPosition,相对于... 旋转在unity3d中用四元数来表示,四元数的一种超复数,由一个实部和3...
  • 很多刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,多则几十个小时,机器总是处于假死机状态,半天看不到结果,...
  • Unity3D面试和笔试题

    2016-09-17 17:34:26
    Unity3D常见面试和笔试题总结问答题
  • 体系结构 ... 为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎 Unity3D的是一个屡获殊荣的工具,...
1 2 3 4 5 ... 20
收藏数 1,844
精华内容 737
热门标签
关键字:

#运动 c unity3d