文档库 最新最全的文档下载
当前位置:文档库 › 使用 Unity (三):理解和使用依赖注入的键

使用 Unity (三):理解和使用依赖注入的键

使用 Unity (三):理解和使用依赖注入的键
使用 Unity (三):理解和使用依赖注入的键

在使用Unity 创建对象之前,需要准备Unity 容器,也即进行注册(类型映射)。在使用Unity(二):配置Unity 、读取配置信息和获取对象中,我们学习了如何使用配置文件来进行注册,而在本文中,我们将学习使用代码来进行各种注册,这些代码所实现的功能同样可以使用配置文件来实现。

因为Unity 自带的文档已在这方面进行了详细说明,所以在此仅对该文档进行了翻译,以下是译文。

Unity 应用程序块容器用键以及可选的名称来标识注册(类型映射)。键是接口一个接口或者一个类(通常是基类)的类型名称,它决定了实现或继承的具体对象的类型。此键标识了映射,所以容器可以在对Get 或者GetAll 的调用的响应中获取具体的对象类型。在有多个针对同一类型的地方,可选的名称用以区分这些映射,并允许代码指定将使用类型的哪个映射。--来自狗刨学习网

本主题的下列章节描述了可以如何使用依赖注入的键:

?用接口的类型做为依赖键

?用对象类型名称做为依赖键

?组合依赖键和注册名

?用于单件对象的依赖键

?用于已有对象和BuildUp 方法的依赖键

?通过依赖键获得所有注册类型的列表

用接口类型做为依赖键

做为使用接受接口类型名称的Register 和Get 方法的重载的示例,下列代码注册了一个用于IMyObject 接口的映射,并指定容器将返回MyRealObject 类的实例(它实现了IMyObject 接口)。在这种情况下,注册键是IMyObject。随后使用键IMyObject 请求实例的代码将接收到一个MyRealObject 类的实例。此示例使用了容器方法的泛型重载。

IUnityContainer myContainer = new UnityContainer();

myContainer.Register();

IMyObject myRealObjectInstance = myContainer.Get();

另一种方法就是,可以使用未泛型的方法重载。下列代码将得到同样的结果。

IUnityContainer myContainer = new UnityContainer();

myContainer.Register(typeof(IMyObject), typeof(MyRealObject));

IMyObject myRealObjectInstance = myContainer.Get(typeof(IMyObject));

注意:前面的二个Unity 容器的泛型和非泛型重载确保Unity 应用程序块可以在不支持泛型的语言中使用。可以在代码中使用任意一种方法(泛型和非泛型的重载),以及根据需要混合使用它们。例如,可以使用泛型重载注册映射,然后使用非泛型重载获取对象实例,返过来也是一样的。

用对象类型名称做为依赖键

在需要注册用于基类或者其他对象类型(不是接口)的映射时,可以使用接受对象类型名称的Register 和Get 方法的重载,它们不使用泛型代码语法。下列示例展示了接受对象类型名称做为键的Register 和Get 方法的重载的使用。下列代码注册了一个用于MyBaseObject 对象的映射,并指定容器将返回一个MyRealObject 类的实例(它继承自MyBaseObject 类)。在这种情况下,注册键是MyBaseObject。随后使用键MyBaseObject 请求实例的代码将接收到一个MyRealObject 类的实例。

IUnityContainer myContainer = new UnityContainer();

myContainer.Register();

MyBaseObject myRealObjectInstance = myContainer.Get();

另一种方法是,可以使用方法的非泛型重载。下列代码可以获得同样的结果。

IUnityContainer myContainer = new UnityContainer();

myContainer.Register(typeof(MyBaseObject), typeof(MyRealObject));

MyBaseObject myRealObjectInstance = myContainer.Get(typeof(MyBaseObject));

组合注册键和依赖名称

如果需要使用同样的名称注册多个映射,就可以指定对象的名称来区分每个映射。然后,指定名称做为键来要获取适当类型的对象。下列代码示范了可以如何注册二个用于同样接口类的映射,然后容器根据在调用的Get 方法中指定的键和名称来返回适当的对象类型。此示例使用了容器方法的泛型重载(同样也可以使用用对象类型而不是接口的依赖键的非泛型方法)。

// Create container and register types

IUnityContainer myContainer = new UnityContainer();

myContainer.Register("One");

myContainer.Register("Two");

// Get an instance of each type

IMyObject myFirstInstance = myContainer.Get("One");

IMyObject mySecondInstance = myContainer.Get("Two");

注意:注册(映射)名称是一个字符串,如果需要,可以包含空格。任何时候,它们是大小写敏感的。例如,名称“Mymapping”和“MyMapping”将指的是二个不同的注册映射。

下列代码示范了可以如何使用接受类型名称的Register 和Get 方法的重载来注册用于同一基类或其他类的二个映射,然后容器根据在调用的Get 方法中指定的键和名称返回适当的对象类型。此示例使用了容器方法的非泛型重载(同样也可以使用用对象类型而不是接口的依赖键的泛型方法)。

// Create container and register types

IUnityContainer myContainer = new UnityContainer();

myContainer.Register(typeof(MyBaseObject), typeof(MyFirstObject), "One"); myContainer.Register(typeof(MyBaseObject), typeof(MySecondObject), "Two");

// Get an instance of each type

MyBaseObject myFirstInstance = myContainer.Get(typeof(MyBaseObject), "One"); MyBaseObject mySecondInstance = myContainer.Get(typeof(MyBaseObject), "Two");

用于单件对象的依赖键

在需要目标对象是一个单件实例时,可以使用SetSingleton 方法来注册在容器中的类型映射。在此有接受接口或者类型名称做为键的SetSingleton 方法的重载,还可以接受一个名称以区分使用同样的键的多个映射。

下列代码展示了可以如何使用接口做为键或者使用类型名称做为键来注册单件,以及在使用同样的键的多个注册的地方提供可选的名称。此示例同时使用了容器方法的泛型和非泛型重载,并展示了如何在注册映射和获取对象实例时混合使用它们。

// Create container and register singletons

IUnityContainer myContainer = new UnityContainer();

myContainer.SetSingleton();

myContainer.SetSingleton("One");

myContainer.SetSingleton(typeof(MyObject), "Two");

myContainer.SetSingleton(typeof(MyObject));

myContainer.SetSingleton("One");

myContainer.SetSingleton(typeof(MyObject) "Two");

// Get the single instance of each type

IMyObject mySingleton = myContainer.Get(typeof(MyObject));

IMyObject myFirstSingleton = myContainer.Get("One");

IMyObject mySecondSingleton = myContainer.Get("Two");

MyObject mySingletonObject = myContainer.Get(typeof(MyObject));

MyObject myFirstSingletonObject = myContainer.Get(typeof(MyObject), "One"); MyObject mySecondSingletonObject = myContainer.Get("Two");

用于已有对象和BuildUp 方法的依赖键

Unity 容器暴露了RegisterInstance 方法的重载,它允许注册依赖注入映射,然后返回单个已有对象实例的引用。这些方法中的每一个都接受标识对象接口或者类型的依赖键,和已有的对象实例。在多个注册使用同样的键的地方,还可以可选的提供一个名称。

Unity 容器还暴露了BuildUp 方法的重载,它允许在需要时直接应用依赖注入到一个对象。BuildUp 方法的重载接受一个已有对象实例的引用。在多个注册的对象使用同样的键的地方,还可以可选的提供一个名称。

如何用依赖键使用RegisterInstance 和BuildUp 方法的细节,请参见理解和使用已有的对象实例。

通过依赖键获取所有注册类型的列表

在要获得指定类型的所有注册对象的列表时,可以使用GetAll 方法。此方法有二个重载,分别接受接口或者类型名称,并返回包含指定类型的所有注册对象的引用的IEnumerable 的实例,但不包括默认映射。由GetAll 方法返回的列表仅包括命名的实例注册。

注意:如果要能获取一个映射类型的列表,记得必须除使用类型(依赖键)之外还要使用名称来注册类型映射是很重要的。换句话说,必须使用除依赖类型之外还接受名称(string 类型)的Register、SetSingleton 和RegisterInstance 方法的重载。

下面的示例展示了可以如何获取用于指定依赖键的注册类型的列表。

// Create container and register types using a name for each one

IUnityContainer myContainer = new UnityContainer();

myContainer.Register();

myContainer.Register("One");

myContainer.Register("Two");

// Get an list of non-default types registered for IMyObject

// List will only contain the types MyFirstObject and MySecondObject

IEnumerable objectList = myContainer.GetAll();

另一种方法是,可以使用容器的非泛型方法来获得同样的结果,除了此时的返回值是Object 类型的IEnumerable 列表以外。

// Create container and register types using a name for each one

IUnityContainer myContainer = new UnityContainer();

myContainer.Register(typeof(MyBaseObject), typeof(MyDefaultObject)); myContainer.Register(typeof(MyBaseObject), typeof(MyFirstObject), "One"); myContainer.Register(typeof(MyBaseObject), typeof(MySecondObject), "Two");

// Get an list of non-default types registered for MyBaseObject

// List will only contain the types MyFirstObject and MySecondObject

IEnumerable objectList = myContainer.GetAll(typeof(MyBaseObject) );

unity3D游戏开发之登录场景和注册场景

首先制作背景图片,在ngui中插入一个texture,把选好的背景图片放入textur 在texture组件上添加一个uistretch脚本(自适应屏幕大小),把其属性中的st 成both,如图所示文章来自【狗刨学习网】

。如果感觉画面失真了,点击你的图片,把其属性中的texture type调成adva 然后把generate mip map选项后面的勾去了就好了,这样我们的背景图片就做好了 然后用ngui自带的组件,拖上去两个input(输入框)组件,再拖进去两个la 件,最后再拖入两个button组件,可以根据自己的喜欢,再加一个label当做游戏的把所有添加的组件放入panel中,这样比较好操作,效果如图所示

下面把注册时的界面搭建好,原理都是一样了,最后的效果如图 下面要写代码来控制所有要触发的事件了,在我们uiroot中的摄像机上创建一gameSence,然后我先口述一下大概流程,随后就贴上代码(其实很简单的几句),界面上需要有交互功能的就两个按钮,一个注册一个进入游戏,进入游戏先不管,因

个涉及到与服务器连接的一些知识,本人小白,还没涉及到,等涉及到的时候一定会家分享一下,言归正传,还一个按钮就是注册,当点击注册的时候,就会弹到注册的中,也就是把当前的登录界面隐藏掉,显示出咱们得注册界面,在咱们得注册界面中及到交互的按钮也是两个,一个提交,一个返回,提交按钮涉及到用户填写的账号要的数据库中,并且提交成功后要返回登录界面,咱们只做返回登录界面的这个功能,跟登录界面跳转到注册界面是一个概念,还有一个返回按钮,也是跳转到登录页面。以后肯定要跟服务器有一个交互的过程,所以在用户点击进入游戏按钮也好,还是注面中的提交按钮也好,在与服务器通讯的过程中,要防止用户再次操作,所以要另见panel,里面放入一个sprite和一个label,把sprite的透明度调成1(!!!注意定不要调成0,调成0后unity就不会渲染,那咱的层级设定就没有意义了,这也算的一个小bug吧),这样就用户就点击不了任何组件了。当通讯完成的时候,再取消panel,用户就可以再次操作了。大概思路就是这样,废话不多说,贴上我的代码,参考,也希望大神挑出我的毛病,哦对了,在说一点,在建父物体的时候,我都是用的我觉得应该用gameobject,因为用panel会增大draw call,对优化有一定的帮助。 using UnityEngine; using System.Collections; public class gameSence : MonoBehaviour { //登录场景 public GameObject sence1; //注册场景

多值依赖与4NF

5.6 多值依赖与4NF 在关系模式中,数据之间是存在一定联系的,而对这种联系处理的适当与否直接关系到模式中数据冗余的情况。函数依赖是一种基本的数据联系,通过对数据函数依赖的讨论和分解,可以有效地消除模式中的冗余现象。函数依赖实质上反映的是“多对一”联系,在实际应用中还会有“一对多”形式的数据联系,诸如此类的不同于函数依赖的数据联系也会产生数据冗余,从而引发各种数据异常现象。本节就讨论数据依赖中“多对一”现象及其产生的问题。

数据库理论及应用基础33 5.6.1 问题的引入 让我们先看下述例子。 例5-17设有一个课程安排关系,如图5.26所示。 课程名称任课教师选用教材名称 高等数学T11 T12 T13 B11 B12 数据结构T21 T22 T23 B21 B22 B23 图5.26 课程安排示意图 在这里的课程安排具有如下语义: z“高等数学”这门课程可以由3个教师担任,同时有两本教材可以选用。 z“数据结构”这门课程可以由3个教师担任,同时有3本教材可供选用。 如果分别用Cn、Tn和Bn表示“课程名称”、“任课教师”和“教材名称”,上述情形可以表示如图5.27所示的关系CTB。 Cn Tn Bn 高等数学T11 B11 高等数学T11 B12 高等数学T12 B11 高等数学T12 B12 高等数学T13 B11 高等数学T13 B12 数据结构T21 B21 数据结构T21 B22 数据结构T21 B23 数据结构T22 B21 数据结构T22 B22 数据结构T22 B23 数据结构T23 B21 数据结构T23 B22 数据结构T23 B23 图5.27 关系CTB 很明显,这个关系表是数据高度冗余的。

Unity场景遮挡剔除技术优化

Unity场景遮挡剔除技术优化 复杂的三维场景,尤其是复杂的地表模型,具有复杂的结构,在渲染时需要花费更多的时间。若要在实时渲染过程中快速绘制地形,应该首先考虑如何解决大规模数据构成的复杂地形表面模型与计算机图形硬件有限的绘制能力之间的矛盾。遮挡剔除技术的出现,很大程度上解决了这一矛盾。 遮挡剔除(Occlusion Culling)技术,是用于三维场景优化的重要技术,当物体被其它更靠近摄像机的物体完全遮挡而无法在摄像机中显示时,将不对该物体进行渲染。虚拟漫游系统的视点离地表较近,三维场景中较远的物体易被较近的物体所遮挡,当应用遮挡剔除技术时,将大幅降低场景中需要渲染的模型的数量,从而增加了产品实时渲染的速度。 Unity中的遮挡剔除技术 遮挡剔除在技术实现上,主要有两类方法: 一是将三维遮挡物体投影生成二维遮挡面并保存到深度缓存中,再利用深度图确立的遮挡关系进行深度剔除操作,即深度剔除法 另一类是将三维遮挡物体映射到二维平面,然后直接叠加到生成图像上,从而解决遮挡问题,即图像叠加方法。 在Unity中使用遮挡剔除时,会在渲染对象被送进渲染管线之前,将因为遮挡而不会被看到的隐藏对象或隐藏面进行剔除,从而减少了每帧的渲染数据量,提高了渲染性能。Unity在减少渲染对象时,先通过摄像机的视场角范围和剪切平面将不显示的内容进行剔除,然后可以对显示视角范围内的保留物体进行遮挡剔除。 Unity中遮挡剔除技术的应用 (一)Occlusion Culling的应用 打开Unity,在场景中导入或者创建三维场景,这里重点研究遮挡剔除问题,所以使用Unity 建立一个如下图所示的简易示例场景。场景中立方体表示实际场景中的建筑,它们之间会根据场景摄像机拍摄位置和视角的变化出现遮挡的情况。Occlusion Culling的应用就是将被遮挡住的物体从渲染队列中剔除,以减少硬件设备的数据计算量。

unity开发游戏的优缺点

Unity做游戏的几个优势: 1、跨平台,平台相关的功能Unity都已经帮你实现好了。即便有些Unity没有实现,也有插件帮你实现。 2、基于Unity的酷炫的粒子光效编辑。Unity本身就是一个功能强大的粒子编辑器。之前我还认为cocos2d-x的粒子系统的功能足够了,但是跟专业的编辑器比起来,远远不够。粒子系统要跟粒子特效编辑器配合起来,其功能远远不是之配置一个粒子系统的几个参数就可以的。cocos2d-x本身的粒子系统是很鸡肋的功能,只能拿来做一些简单的光效,不可能用来做复杂的技能特效。 3、由于框架和架构的优势,Unity的游戏可以极大程度避免崩溃和闪退。由于代码都是c#写的,并且是组件结构,所以即便出了错误也只是个异常而已,而不会影响到系统流程。 4、强大的性能分析工具,可以轻易的找到内存和cpu 的瓶颈。支持Android和iOS的真机运行分析。 5、编辑器可以方便的进行扩展,不需要像传统游戏公司一样,有一个专门写编辑器的部门。无论是场景编辑器还是技能编辑器都可以轻松搞定。如果想玩高科技的话,还可以把技能编辑器做成可拖拽的模块化结构,策划可以像搭积木一样来编辑技能。最重要的是,这些都是所见即所得的。 6、方便的资源管理系统。使用Unity,你不用特意维护几份资源(比如原始资源、打包后的资源、iOS版本资源、Android版本资源等等),只要一份资源,然后Unity里面可以设置它的具体参数,比如使用纹理压缩、最大限制在512x512大小等等。Unity发布游戏的时候会自动根据平台相关的导出选项导出正确的资源。 7、丰富的插件。有大量的功能我无论拿cocos2d-x还是Unity都不知道怎么实现。比如一些shader特效、物件碎裂的特效、场景破坏和变形的特效等等,这些在Unity插件中都可以找到对应的实现。而且很多Unity 的游戏都可以反编译,无形中又可以学到很多东西。 8、熟悉之后确实感觉Unity很简单。很多功能都是成体系的自然而然的。比如物理、碰撞检测、导航寻路、场景管理、场景烘焙。这些

关系数据理论课后答案

关系数据理论课后答案 第五章关系数据理论 习题解答和解析 1.理解并给出下列术语的定义:函数依赖、部分函数依赖、完全函数依赖、传递依赖、候选码、主码、外码、全码(All-key)、1NF、2NF、3NF、BCNF、多值依赖、4NF。 解析:解答本题不能仅仅把《概论》上的定义写下来。关键是真正理解和运用这些概念。 答:函数依赖:设R(U)是一个关系模式,U是R的属性集合,X和Y是U的子集。对于R(U)的任意一个可能的关系r,如果r中不存在两个元组,它们在X上的属性值相同,而在Y上的属性值不同,则称"X函数确定Y"或"Y函数依赖于X",记作X→Y。 解析: (1)函数依赖是最基本的一种数据依赖,也是最重要的一种数据依赖。 (2)函数依赖是属性之间的一种联系,体现在属性值是否相等。由上面的定义可以知道,如果X→Y,则r中任意两个元组,若它们在X上的属性值相同,那么在Y上的属性值一定也相同。 (3)要从属性间实际存在的语义来确定他们之间的函数依赖,即函数依赖反映了(描述了)现实世界的一种语义。 (4)函数依赖不是指关系模式R在某个时刻的关系(值)满足的约束条件,而是指R任何时刻的一切关系均要满足的约束条件。

答:完全函数依赖、部分函数依赖:在R(U)中,如果X→Y,并且对于X的任何一个真子集X',都有X'Y,则称Y对X完全函数依赖,记作: 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作: ?→Z,则称Z对X传递函数依赖。 传递依赖:在R(U)中,如果X→Y,(Y 候选码、主码:设K为R中的属性或属性组合,若K→U(完全依赖)则K为R的候选码(Candidate key)。若候选码多于一个,则选运其中的一个为主码(Pdmary key)。 解析: 1)这里我们用函数依赖来严格定义码的概念。在第二章中我们只是描述性地定义码(可以复习若关系中的某一属性组的值能惟一地标识一个元组,则称该属性组为候选码(Candidate key)。2)因为码有了严格定义,在学习了《概论》数据依赖的公理系统后就可 以从R的函数依赖集F出发,用算法来求候选码。 答:外码:关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外部码(Foreign key),也称外码。全码:整个属性组是码,称为全码(All--key)。 答:1NF:如果一个关系模式R的所有属性都是不可分的基本数

Unity3D教程:实现多人场景的网络通信

Unity3D教程:实现多人场景的网络通信 Posted on 2013年01月30日 by U3d / Unity3D 基础教程/被围观 358 次 1.首先要准备一个client和server通信的连接对象和脚本,可以做到同一个程序里,通过点击不同的按钮决定充当client或是server。 2.服务器不需要控制人物,只需要提供一个连接的场所,客户端连入后,需要每个为客户端创建一个新角色。可以把玩家作为一个prefab,建立另一个对象SpawnPlayer,并附加脚本Spawnscript.js监控客户端连接到服务器上的事件OnConnectedToServer,这个 事件只有客户端才会触发。当触发后,就会在场景中用角色的prefab创建出一个新的实例,并且让所有人的场景中也都创建出来,这需要使用Network.Instantiate方法,这个 方法会用参数中给出的prefab在所有的客户端场景指定位置创建一个实例,底层其实是 封装了RPC调用。 3.玩家本身会附带控制脚本,但是客户端需要进行镜头追踪,因为玩家是动态生成出来的,所以开始时Camera上的追踪脚本的追踪目标并没有绑定到玩家,所以需要进行这一步操作。还要保证绑定的对象是自己客户端所对应的人物,而不是别人的人物,所以最 好从刚才Network.Instantiate时保存下自己创建出来的人物,然后将Camera脚本的target赋值为它。

从一个对象获取它的脚本的方法是用GameObject.GetComponet(Type type)函数,参数需要传脚本的类名,类名Unity规定是和脚本文件名的前缀是相同的,比如SmoothFollow.js就是SmoothFollow。 4.需要给人物的prefab增加NetworkView的Component来,因为需要既需要同 步人物的Transform信息,也需要同步Animation,所以增加2个NetworkView,这里决 定使用状态同步机制(也可以用RPC),所以设置相关状态同步的属性。 5.人物角色的控制需要一些特殊处理,因为每个创建出来的角色都有相同的控制脚本,而一个客户端只能控制自己的人物,在进行控制响应之前,需要确定是自己的人物才可以 操作。 这里使用人物身上的networkView的类方法isMine来判断。只有创建了这个人物 的client的这个属性才会为true。所以只要看这个属性不为true,在控制人物位移、跳跃、动画之前就直接return掉就可以了。

关系代数和数据依赖概念

第二讲关系代数和数据依赖概念 1 关系代数 1970年IBM公司的E.F.Cood博士在论文“一个通用关系式数据库系统的模型”中首先提出了关系模型,它提供了格式化数据库系统难以做到的数据独立性和数据相容性。此模型后来又由Codd加以改进,被许多人认为是一切数据库系统的未来。 关系数据库之所以发展如此之快,因为关系数据库的模型简明,便于用户理解使用方便等等特点,更重要的是,关系数据库有着网状和层次数据库没有的数学基础----关系代数,可以利用关系代数对表格进行任意的分割和组装,随机地产生用户所需要的各种新表,这为关系数据的发展提供了基础和保证。 1.1 基本概念 术语 定义给定一组集合D1,D2,...,D n,它们可以是相同的,若R是这样一个有序n元组:

则称R是对于这n个集合的一个关系,并称集合D1,D2,...,D n为关系R的域,称n为关系的度。 1.2 关系运算 在关系模型中,实体以及实体间的联系采用了单一数据结构----关系来表示。对数据的操作就是对关系的运算。关系运算的形式可分为两大类: (1)关系代数:把关系看作集合,以关系为运算对象的关系运算。 (2)关系演算:使用数理逻辑谓词演算概念的关系运算。 1.2.1 并(Union) 设R和S为同类关系,即具有相同的度和相应属性在相同的域中取值,但并不要求属性名一致,则关系R和S的并由属于R或属于S的所有元组构成,记作R S。 例:

SQL语句: Select * from R Union Select * from S 1.2.2 交(Intersection) 设R和S为同类关系,则关系R和S的交由属于R同时属于S的所有元组构成,记作R S。 例:

关系数据理论课后答案

第五章关系数据理论 习题解答和解析 1. 理解并给出下列术语的定义:函数依赖、部分函数依赖、完全函数依赖、传递依赖、 候选码、主码、外码、全码(All-key) 、1NF 2NF 3NF、BCNF多值依赖、4NF。 解析:解答本题不能仅仅把《概论》上的定义写下来。关键是真正理解和运用这些概念。 答:函数依赖:设R(U)是一个关系模式,U是R的属性集合,X和Y是U的子集。对于R(U) 的任意一个可能的关系r,如果r中不存在两个元组,它们在X上的属性值相同,而在Y上的属性值不同,则称"X函数确定Y"或"Y函数依赖于X",记作心Y。 解析: (1) 函数依赖是最基本的一种数据依赖,也是最重要的一种数据依赖。 (2) 函数依赖是属性之间的一种联系,体现在属性值是否相等。由上面的定义可以知道,如果X Y,则r中任意两个元组,若它们在X上的属性值相同,那么在Y上的属性值一定也相同。 (3) 要从属性间实际存在的语义来确定他们之间的函数依赖,即函数依赖反映了(描述了)现实世界的一种语义。 (4) 函数依赖不是指关系模式R在某个时刻的关系(值)满足的约束条件,而是指R任何时 刻的一切关系均要满足的约束条件。 答:完全函数依赖、部分函数依赖:在R(U)中,如果X T Y,并且对于X的任何一个真子 集X',都有X' Y, 则称Y对X完全函数依赖,记作: 若X T Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作: 传递依赖:在R(U)中,如果X T Y,(Y ? X),Y、\,Y T乙则称Z对X传递函数依赖。 候选码、主码:设K为R中的属性或属性组合,若K T U(完全依赖)则K为R的候选码(Candidate key)。若候选码多于一个,则选运其中的一个为主码(Pdmary key)。 解析: 1) 这里我们用函数依赖来严格定义码的概念。在第二章中我们只是描述性地定义码(可以复习若关系中的某一属性组的值能惟一地标识一个元组,则称该属性组为候选码 (Can didate key) 。 2) 因为码有了严格定义,在学习了《概论》数据依赖的公理系统后就可 以从R的函数依赖集F出发,用算法来求候选码。 答:外码:关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外部码(Foreign key), 也称外码。 全码:整个属性组是码,称为全码(All--key)。 答:1NF:如果一个关系模式R的所有属性都是不可分的基本数据项,则R INF。

第六章 函数依赖

朱彦荣 20132184 软件工程2 第六章作业 一. 简答题 1.数据依赖的分类? 函数依赖,多值依赖,连接依赖 2.关系模式可能存在的4个问题? 插入异常、删除异常、冗余、更新异常 3.函数依赖的分类? 平凡函数依赖、非平凡函数依赖、完全函数依赖、部分函数依赖、传递函数依赖 4.函数依赖范畴内的4个范式? 第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCNF范式 5.3NF关系模式存在异常的可能原因? 仍可能出现插入异常、删除异常、冗余和更新异常。原因是:还可能存在主属性部分函数依赖于键。 6.关系模式规范化的方法? 首先要保证属性的原子性,即至少为1NF,然后由1NF到2NF是消除非主属性对键的部分函数依赖,2NF到3NF是消除非主属性对键的传递函数依赖。3NF到BCNF是消除主属性对键的部分函数依赖和传递函数依赖,一般来说到这里就可以了。然后,有BCNF范式到4NF范式消除非平凡且非函数依赖的多值依赖,最后由4NF到5NF是消除不是候选键所蕴含的连接依赖。 7.如果X和Y之间是1:n的联系,则X和Y之间的函数关系是谁决定谁?如果是1:1和 m:n呢? 若X:Y=1:N,则N方决定1方,即Y->X 若X:Y=1:1,则X->Y且Y->X,即X<->Y,X和Y等价 若X:Y=M:N,则不能相互决定 二.设有关系模式:R(Sid,Sname,Cid,Cname,Score,Tid),其中:Sid、Sname、Cid、Cname、Score、Tid分别表示学号、学生姓名、课程编号、课程名、成绩、教师编号,并有如下语义要求: ●课程与教师间的联系为1:1; ●学生与课程间的联系为m:n; ●一名学生只能有一个学号,且学号唯一; ●一门课程只能有一个课程号,且课程号唯一。 请完成:

数据库概论课后题答案

5.设有一个SPJ数据库,包括S,P,J,SPJ四个关系模式: 1)求供应工程J1零件的供应商号码SNO: πSno(σSno=‘J1’(SPJ)) 2)求供应工程J1零件P1的供应商号码SNO: πSno(σSno=‘J1’∧Pno=‘P1‘(SPJ)) 3)求供应工程J1零件为红色的供应商号码SNO: πSno(σPno=‘P1‘(σCOLOR=’红‘(P)∞SPJ)) 4)求没有使用天津供应商生产的红色零件的工程号JNO: πJno(SPJ)- πJNO(σcity=‘天津’∧Color=‘红‘(S∞SPJ∞P) 5)求至少用了供应商S1所供应的全部零件的工程号JNO: πJno,Pno(SPJ)÷πPno(σSno=‘S1‘(SPJ)) 第6章关系数据库理论 1 .理解并给出下列术语的定义:函数依赖、部分函数依赖、完全函数依赖、传递依赖、候选码、主码、外码、全码(All 一key )、1 NF 、ZNF 、3NF 、BcNF 、多值依赖、4NF 。 定义1:设R(U)是属性集U上的关系模式。X,Y是属性集U的子集。若对于R(U)的任意一个可能的关系r,r 中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X,记作X Y。(即只要X上的属性值相等,Y上的值一定相等。) 术语和记号: X Y,但Y不是X的子集,则称X Y是非平凡的函数依赖。若不特别声明,总是讨论非平凡的函数依赖。X Y,但Y是X的子集,则称X Y是平凡的函数依赖。 若X Y,则X叫做决定因素(Determinant)。 若X Y,Y X,则记作X Y。 若Y不函数依赖于X,则记作X Y。 定义2:在R(U)中,如果X Y,并且对于X的任何一个真子集X’,都有X’ Y,则称Y对X完全函数依赖若X Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖 定义3:若关系模式R的每一个分量是不可再分的数据项,则关系模式R属于第一范式(1NF)。 定义4:若关系模式R∈1NF,且每一个非主属性完全函数依赖于码,则关系模式R∈2NF 。(即1NF消除了非主属性对码的部分函数依赖则成为2NF)。 定义5:关系模式R 中若不存在这样的码X、属性组Y及非主属性Z(Z不是Y的子集)使得X Y,Y X,Y Z成立,则称R∈3NF。 定义6:关系模式R∈1NF 。若X Y且Y不是X的子集时,X必含有码,则R∈BCNF。 定义7:关系模式R∈1NF,如果对于R的每个非平凡多值依赖X Y(Y不是X的子集,Z=U-X-Y不为空),X都含有码,则称R∈4NF。 2.建立一个关于系、学生、班级、学会等诸信息的关系数据库。 学生:学号、姓名、出生年月、系名、班号、宿舍区。 班级:班号、专业名、系名、人数、入校年份。 系:系名、系号、系办公地点、人数。 学会:学会名、成立年份、办公地点、人数。 语义如下:一个系有若干专业,每个专业每年只招一个班,每个班有若干学生。一个系的学生住在同一宿舍区。每个学生可参加若干学会,每个学会有若干学生。学生参加某学会有一个入会年份。 请给出关系模式,写出每个关系模式的极小函数依赖集,指出是否存在传递函数依赖,对于函数依赖左部是多属性的情况讨论函数依赖是完全函数依赖,还是部分函数依赖。指出各关系模式的候选码、外部码,有没有全码存在?

Unity3d游戏场景优化

Unity3d游戏场景优化 涉及到Lod技术 (Levels of Detail,多细节层次),选择剔除(Culling),光照贴图(Lightmap) (一) 光照贴图 动态实时灯光相比静态灯光,非常耗费资源。所以除了能动的角色和物体静态的 地形和建筑,通通使用Lightmap。 强大的Unity内置了一个强大的光照图烘焙工具Beast,这个东东是Autodesk公司的产品(可怕的垄断,感觉和3d沾边的软件丫都要插一手)。 据说用来制作过杀戮地带和镜之边缘。

镜之边缘建筑场景漂亮干净的光影,Lightmap的效果。 在Unity中制作Lightmap很方便,调节几个参数后直接烘焙即可。支持GI, Skylight, 效果一流!!!当然你需要一台好点的机器,不然漫长的烘焙过程你就有的等了。 内置的光照图烘焙工具Beast P场景准备和光照图烘焙点选Window --> Lightmapping 打开光照图烘焙面板: 1.确认所有将要被用来烘焙光照贴图的网格体 UVs正确无误. 最简单的办法是在mesh import settings中选择 Generate Lightmap UVs选项(由Beast自动分uv) 2.在Object面板中将所有网格体或地形标注为 static –这将告诉 Unity, 这些物体将不会被移动 和改变并且可以被赋予光照贴图。 3.为了控制光照贴图的精度, 进入Bake 面板并调整Resolution 的值. (为了更好的了解你的

lightmap texels使用情况, 在Scene 视窗中找到Lightmap Display 小窗口并且选择Show Resolution). 1. 点击 Bake 按钮。 2. Unity Editor's 会出现一个进度条,位置处于右下角. 3. 当烘焙结束, Lightmap Editor窗口会显示已经烘焙好的光照图. Scene 和 game 视图会同时自动更新–现在你的场景已经有了光照图的效果! Unity Lightmap的设置还有更详细和更高端的内容,请参考自带的文档!

unity3d无缝场景切换解决方案

unity3d无缝场景切换解决方案(1) - 简单场景切 换 所谓无缝场景切换,无非是涉及到场景或物体的预读,复杂点涉及下场景卸载,在复杂点涉及到场景二维数组,再在复杂点涉及数据结构用二叉树实现场景资源有序的读取与卸载。当然,复杂的我以后慢慢再说,比较懒,先写最简单的,如果能起到抛砖引玉作用,那这篇文章也算是物有所值了。 无缝场景切换的优缺点: 优点: 1.场景(游戏)连贯性。 2.相对于多场景游戏,不需要等待场景更换(在进入场景后已经在实 时加载下一个场景了) 3.相对于单个大场景,这种方式能避免所有的场景数据被装入内存 (尽管u3d优化很好并不会被渲染出来),很大的数据在内存里影响你游戏的性能(特别是在iphone这种小内存环境)。 缺点: 1.操作繁琐(本文介绍比较基础简单的方式) 2.开发者要求较高(注意保持逻辑清晰,不然后期你会全乱掉的) 涉及到几个U3D函数: Application.LoadLevel(lv) 场景读取(记着用多场景前要现在File-Build Setting里登记下场景,才能在脚本里读取到) DontDestroyOnLoad(object) 保持物体在场景切换的时候不被卸载

(能保持他的所有属性哦)  *AssetBundle 类 预读资源(主要用于web3d,运行时实时从服务器下载需要的场景资源) 涉及到几个基础知识: static 静态类、静态变量:在整个游戏中都不会被重新加载,所以可以当全局全场景变量使用,主要用于记录场景数组。 Collider的Is Trigger属性:设置成True,他是可以穿越不会产生能量传递的,但是,他是可以接受碰撞侦测的。配合主角的OnTriggerEnter 事件,就可以知道你是否正在穿越一个Trigger了。在这里,我们用在判断何时加载新场景上。 简单的无缝场景切换方案: 1.建立场景(已经做好很大场景的就准备做切割吧) 场景尽量小,如果是web3d,那需要更小,已保证场景在网络上传输时间不至于太长,在漫游中再实时读取其他场景数据。一般来说,场景大小考虑因素有两种:如果是web3d模式,考虑网络传输速度;如果是pc,mac,wii,iphone,那就得考虑内存或显存能吃你多少场景数据并且处理起来不费力。 按照你所需要建立的无缝场景切换方式,你可以按场景的坐标建立以下几种方式:

蔡延光《数据库原理与应用》课后习题七答案

习题七 1. 给出下列术语的定义,并加以理解。 函数依赖、部分函数依赖、完全函数依赖、传递函数依赖、候选关键字、主关键字、全关键字、1NF、2NF、3NF、BCNF、多值依赖、4NF、连接依赖、5NF。 2. 现在要建立关于系、学生、班级、学会诸信息的一个关系数据库。语义为:一个系有若干专业,每个专业每年只招一个班,每个班有若干学生,一个系的学生住在同一个宿舍区,每个学生可参加若干学会,每个学会有若干学生。 描述学生的属性有:学号、姓名、出生日期、系名、班号、宿舍区; 描述班级的属性有:班号、专业名、系名、人数、入校年份; 描述系的属性有:系名、系号、系办公室地点、人数; 描述学会的属性有:学会名、成立年份、地点、人数、学生参加某会有一个入会年份。 l)请写出关系模式。 2)写出每个关系模式的最小函数依赖集,指出是否存在传递依赖。在函数依赖左部是多属性的情况下,讨论函数依赖是完全依赖,还是部分函数依赖。 3)指出各个关系模式的候选关键字,外部关键字,以及有没有全关键字。 3. 设关系模式R,函数依赖集F={A→C,C→A, B→AC,D→AC,BD→A}。 1)求出R的候选码。 2)求出F的最小函数依赖集。 3)将R分解为3NF,使其既具有无损连接性又具有函数依赖保持性。 4)设关系模式R,函数依赖集F={AB→E,AC→F,AD→B,B→C,C→D}。 1)证明AB、AC、AD均是候选关键宇。 2)证明主属性C部分依赖于关键字AB,传递依赖于AD。同时证明主属性D部分依赖于关键字AC,传递依赖于关键字AB。 5. 设关系模式R,函数依赖集F={AB→E,BC→D,BE→C,CD→B,CE→AF,CF→BD,C→A,D→EF},求F的最小函数依赖集。 6 判断下面的关系模式是不是BCNF,为什么? 1)任何一个二元关系。 2)关系模式选课(学号,课程号,成绩),函数依赖集F={(学号,课程号)→成绩}。 3)关系模式R(A,B,C,D,E,F),函数依赖集F={A→BC,BC→A,BCD→EF,E→C}。 7. 设关系模式R(A,B,C,D,E,F),函数依赖集F={A→B,C→F,E→A,CE→A},将R分解为P={ABE,CDEF}。判断p是否是无损连接。 8. 设关系模式R{B,O,I,S,Q.D},函数依赖集F={S→D,I→S,IS→Q,B→Q}。 l)找出R的主码。 2)把R分解为BCNF,且具有无损连接性。 9. 在关系模式选课(学号,课程号,成绩)中,“学号→→课程号”正确吗?为什么? 10. 设有关系模式R(A,B,C),数据依赖集F={AB→C,C→→A},R属于第几范式?为什么? 11. 设有关系模式R(A,B,C,D),数据依赖集F={A→B,B→A,AC→D,BC→D,AD→C,BD→C,A→→CD,B→→CD}。 1)求R的主码。 2)R是否为第4范式?为什么? 3)R是否是BCNF?为什么? 4)R是否是3NF?为什么?

Unity3D技术之Advanced优化图形性能详解

Unity3D技术之Advanced优化图形性能详解 优化图形性能良好的性能对大部分游戏的成功具有决定作用。下面是一些简单的指导,用来最大限度地提高游戏的图形渲染。 图形需要哪些开销游戏的图形部分主要开销来自电脑的两个系统: GPU 或 CPU。优化的第一条原则是找到性能出现问题的地方;因为 GPU 和 CPU 的优化策略不尽相同(甚至 可能截然不同—因此,通常在优化 CPU 的时候会给 GPU 带来更多工作,反之亦然)。 主要瓶颈以及检查瓶颈的方式: ?GPU 通常受供给比率或内存带宽的限制。 ?以更低的显示分辨率运行游戏是否更快?如果是,您极有可能受到了 GPU 上的攻击比率限制。 CPU 通常受需要渲染的对象的数量限制,又称“绘制调用”。 ?在渲染统计信息 (Rendering Statistics) 窗口中查看“绘制调用”,如果数值超过数千(电脑)或数百(手机),那么您可能需要优化对象数量。当然,这些只是经验法则;瓶颈也可能存在于其他地方。非主要瓶颈: ?渲染不是问题,不管是对 GPU 还是 CPU!例如,您的脚本或物理可能是问题的根源。使用分析器找出问题所在。 ?GPU 需要处理的顶点过多。多少个顶点比较“适中”取决于 GPU 以及顶点着色器的复杂程度。对于手机来说,主要图形“不应超过 10 万个”,电脑则“不应超过 1000 万个”。 ?CPU 要处理的顶点过多,因为这些对象要在 CPU 上进行顶点处理。这可能是蒙皮网格、棉布仿真、粒子等。文章出处【狗刨学习网】 CPU 优化—绘制调用数量为了渲染屏幕上的所有对象,CPU 任务艰巨—这些工作 包括识别哪些光照效果会影响对象,设置着色器和着色器参数,向显卡驱动发送调用命令,然后显卡驱动准备将命令发送至显卡。所有这些“逐对象” CPU 开销都不小,因此,如果您拥有大量可见对象,它可以累计。 例如,Unity如果您有 1000 个三角形,如果所有三角形都在一个网格内,而不是 1000 个独立的网格分别拥有一个三角形,那么,成本将明显降低。 Java

Unity3D 美术资源规范

Unity3D 美术资源规范 一.单位,比例统一 在建模型前先设置好单位,在同一场景中会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序需要缩放也可以统一调整缩放比例。统一单位为米。 二.模型规范 ⒈所有角色模型最好站立在原点。没有特定要求下,必须以物体对象中心为轴心。 ⒉面数的控制。移动设备每个网格模型控制在300-1500个多边形将会达到比较好的效果。而对于桌面平台,理论范围1500-4000。如果游戏中任意时刻内屏幕上出现了大量的角色,那么就应该降低每个角色的面数。比如,半条命2对于每个角色使用2500-5000个三角面。 正常单个物体控制在1000个面以下,整个屏幕应控制在7500个面以下。所有物体不超过20000个三角面。 ⒊整理模型文件,仔细检查模型文件,尽量做到最大优化,看不到的地方不需要的面要删除,合并断开的顶点,移除孤立的顶点,注意模型的命名规范。模型给绑定之前必须做一次重置变换。 ⒋可以复制的物体尽量复制。如果一个1000面的物体,烘焙好之后复制出去100个,那么他所消耗的资源基本和一个物体消耗的资源一样多。 三.材质贴图规范

⒈我们目前使用的Unity3D软件作为仿真开发平台,该软件对模型的材质有一些特殊的要求,在我们使用的3dsMax中不是所有材质都被Unity3D软件所支持,只有standard(标准材质)和Multi/Sub-Objiect(多维/子物体材质)被Unity3D软件所支持。注:Multi/Sub-Objiect(多维/子物体材质)要注意里面的子材质必须为standard(标准材质)才能被支持。 ⒉Unity3D目前只支持Bitmap贴图类型,其它所有贴图类型均不支持。只支持DiffuseColor (漫反射)同self-Illumination(自发光,用来导出lightmap)贴图通道。Self-Illumination(不透明)贴图通道在烘焙lightmap后,需要将此贴图通道channel设置为烘焙后的新channel,同时将生成的lightmap指向到self-Illumination。 四.贴图文件格式和尺寸 原始贴图不带通道的jpg,带通道的为32位tga或者png,尺寸最大别超过2048,贴图文件尺寸须为2的N次方(8、16、32、64、128、256、512、1024)最大贴图尺寸不能超过1024x1024,特殊情况下尺寸可在这些范围内做调整。 五.贴图材质应用规则 ⒈贴图不能为中文命名,不能有重名; ⒉材质球命名与物体名称一致,材质球的父子层级的命名必须一致;

数据库课后题答案 第6章 关系数据库理论

第6章关系数据库理论 1 .理解并给出下列术语的定义: 函数依赖、部分函数依赖、完全函数依赖、传递依赖、候选码、主码、外码、全码(All 一key )、1 NF 、ZNF 、3NF 、BcNF 、多值依赖、4NF 。 定义1:设R(U)是属性集U上的关系模式。X,Y是属性集U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X,记作X→Y。(即只要X上的属性值相等,Y上的值一定相等。) 术语和记号: X→Y,但Y不是X的子集,则称X→Y是非平凡的函数依赖。若不特别声明,总是讨论非平凡的函数依赖。 X→Y,但Y是X的子集,则称X→Y是平凡的函数依赖。 若X→Y,则X叫做决定因素(Determinant)。 若X→Y,Y→X,则记作X←→Y。 若Y不函数依赖于X,则记作X → Y。 定义2:在R(U)中,如果X→Y,并且对于X的任何一个真子集X’,都有X’→ Y,则称Y 对X完全函数依赖 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖 定义3:若关系模式R的每一个分量是不可再分的数据项,则关系模式R属于第一范式(1NF)。定义4:若关系模式R∈1NF,且每一个非主属性完全函数依赖于码,则关系模式R∈2NF 。(即1NF消除了非主属性对码的部分函数依赖则成为2NF)。 定义5:关系模式R 中若不存在这样的码X、属性组Y及非主属性Z(Z不是Y的子集)使得X→Y,Y→ X,Y→ Z成立,则称R∈3NF。 定义6:关系模式R∈1NF 。若X→Y且Y不是X的子集时,X必含有码,则R∈BCNF。 定义7:关系模式R∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y不是X的子集,Z=U-X-Y不为空),X都含有码,则称R∈4NF。 2.建立一个关于系、学生、班级、学会等诸信息的关系数据库。 学生:学号、姓名、出生年月、系名、班号、宿舍区。 班级:班号、专业名、系名、人数、入校年份。 系:系名、系号、系办公地点、人数。 学会:学会名、成立年份、办公地点、人数。 语义如下:一个系有若干专业,每个专业每年只招一个班,每个班有若干学生。一个系的学生住在同一宿舍区。每个学生可参加若干学会,每个学会有若干学生。学生参加某学会有一个入会年份。 请给出关系模式,写出每个关系模式的极小函数依赖集,指出是否存在传递函数依赖,对于函数依赖左部是多属性的情况讨论函数依赖是完全函数依赖,还是部分函数依赖。指出各关系模式的候选码、外部码,有没有全码存在? 解:(1)关系模式如下: 学生:S(Sno,Sname,Sbirth,Dept,Class,Rno) 班级:C(Class,Pname,Dept,Cnum,Cyear) 系:D(Dept,Dno,Office,Dnum) 学会:M(Mname,Myear,Maddr,Mnum)

基于Unity3D的虚拟地理环境构建

龙源期刊网 https://www.wendangku.net/doc/1110123189.html, 基于Unity3D的虚拟地理环境构建 作者:刘海艳陆映峰 来源:《商情》2020年第39期 【摘要】虚拟地理环境是基于虚拟技术而出现的一种全新内容,其本身能够有效的模拟实际的景物,从而实现对实际景物的模拟操作。这种情况下,虚拟地理环境构建就能够帮助很多行业实现之前不可能完成的任何。例如在建筑行业,可以通过虚拟地理环境的构建,来实现对环境的高度模拟,从而添加建筑等,来进行完整的视图。但是目前来看,我国的虚拟地理环境构建存在的问题非常严重,其主要的构建的地理环境和实际偏差过大,导致难以满足使用的需求。则本文将从基于Unity3D的虚拟地理环境构建方法入手,全面的展开基于Unity3D的虚拟地理环境构建探究。 【关键词】Unity3D技术; 虚拟地理环境构建; 虚拟环境生成 一、基于Unity3D的虚拟地理环境构建方法 Unity3D是一种全新的技术,这种技术的特点就是具有更加精密的计算引擎,能够实现更多维度的计算。但是这种计算应该是基于现实而出现的,或者说是基于现实规则而出现的,所以在使用Unity3D技术的使用,需要在其中导入相关的算式,这样才能塑造出更加真实的内容。目前来看,我国的虚拟地理环境构建方法之中,并不能有效的进行Unity3D技术的全面应用,主要是对相关的构建方法不够了解,为了更好的改变这种情况,所以本文提出具体的构建方法: (一)基本构建步骤 根据Unity3D仿真平台的特点,基于Unity3D的虚拟环境生成过程可以简化为以下几个步骤。按照先后顺便分别是地形地物素材准备、基本环境生成及修理、纹理贴图、道路巷道设置、树木植被叠加、地表植被叠加和地形细节设置等步骤。 (二)构建优化方法 虚拟环境生成方法中所谓的优化包含2个方面:一是对地形生成先后顺序的优化,二是对各步骤所需素材及辅助工具的优化。从本质上讲,都是环境生成的必要环节,没有先后顺序之分。但考虑到地形和地物建模的方便性和Unity3D场景的特点,通常按照“从下到上、从小到大、从疏到密、从点到面”的原则进行。地表纹理处理最底层,制作优先度高,其次是巷道沟渠,然后是建筑。从高度上讲,它们往往处于地表之下或紧贴地表或结构复杂,制作的优先度是在灌木和植被之上。辅助工具优化表现在右侧方框中,结合U-nity3D平台的开发特点,描

Unity模型制作规范及解决方法

《3D-Unity模型物体制作规范》 01.管理场景。首先看看场景有没有虚拟体,辅助对象,空组,空物体,全部都要删除。以免场景 过大,或是影响到后期物体的动画调整。 02.优化模型。工业模型尽量不要出现,能用简模就用简模.优化模型的目的就是进unity运行 的更快。首先你要保证模型能用。优化之前先与方案人员沟通,哪些物体可以删除,哪些物体被遮掩看不到,尽可能的节省面数。只是单纯的去优化模型删边删面,面数少不了多少。 03. 检测模型。首先导出你所优化的所有模型,看看是否能全部导出,第二步在unity里旋转看看模型是否有破面。这一步很关键,要确保模型能导出,物体没有破面。 04. 材质。unity里的物体材质,需要max提供材质球.标准做法就是3d人员在max里将物体材质琢个上一遍,只需要上一个基本色,即物体的漫反射。物体表面有材质球命名与物体命名统一,全部用英文.举例,物体a,材质名称就是a.如果用中文,unity都是乱码.物体的贴图也要用英文,这样导fbx时,勾选贴图,材质贴图在unity里就能直接显示,省去unity人员在琢个加载贴图.所有物体包括拆装工具都要加uvw贴图,本身有纹理贴图或是已经展过uv的物体就不要再加了。不展uv,影响到unity里物体材质效果。 05.动画调整。注意的就是工具动画要放到场景里去调试,以免跟附近其它模型有穿插.max工具动画是不需要调整的,后期unity人员会用程序代码控制.3d人员的工作就是将物体轴心调到跟工具轴心一致。动画帧数要用text文档记录好.举例,螺栓01拆1-10, 螺栓01装11-20,之后做好发给unity人员好切动画. 06.组的应用,父子关系的应用。理解清楚这些概念,才能更好的去做动画,服务项目。 注意事项及技巧 01.由于Unity看不到单面模型的反面,故导出请仔细检查单面物体。如玻璃。 02.材质、贴图、模型名称中不能出现中文。进unity,不要出现中文名,以免出现乱码,报错。 03.地面用贴图,不要用子材质。 04.max默认的uv平铺在unity里是出错的,要加uvw贴图去调整。 05.相同材质的模型用同一个材质,以减轻系统与后期材质制作负担。 06.可以塌陷的模型尽量塌陷。 07.单个模型四边面数不能超过3万。极限是三万,大概在两万五就可以。 08.零件所对应的碰撞体,命名规范参照《1ZR零部件参数定义》。 09.动画曲线是直线,做之前先将max设置好。 10.工具轴心要统一.将工具对好要拆卸的物体,然后调整物体轴心,确保物体工具轴心统一。 11.所有物体的碰撞体命名要规范,如,aa,碰撞体名为Collider_aa,第一个字母C要大写。检查碰撞体是否都绑定上物体。 12.物体的关键帧只能出现在一段时间内,其它时间段内不要出现此物体的关键帧。除非是同一时间段,多个物体同时动画,才允许同一时间内出现关键帧。 13.场景合并文件或是导出fbx之前,记得要保存,跟建模布尔之前要保存是一个概念,max经常会出现意外的报错。

相关文档