Unity3D项目开发一点经验
我们主要使用3dsmax2010进行制作,输出FBX的类型导入Unity3D中。默认情况下,3dsmax8可以和U3D软件直接融合,自动转换为FBX物体。
注意事项如下:
1.面数控制
在MAX软件中制作单一GameObject物体的面数不能超过65000个三角形,即32500个多边形Poly,如果超过这个数量的物体不会显示出来,这就需要我们合理分布多边形和模型数量。打开MAX场景,选择File/Properties/SummaryInfo可以打开文件属性记录。其中Faces可以看到每个物体的实际数量,个体数量不能超过65000个Faces面。
2.建模控制
Unity3D软件支持Line渲染和编辑之后所产生的模型。大部分模型都依靠Polygon进行制作。在模型表面可以承认多出四边形的面,但不渲染交错的面。默认情况下,U3D引擎是不承认双面材质的,除非使用植物材质球Nature类型。所以在制作窗户、护栏等物体,如果想在两面都能看到模型,那需要制作出厚度,或者复制两个面翻转其中一个的Normal法线。
3.文件的放置
模型可以继承MAX的材质,但是文件的设置要按照以下形式进行放在项目的Assets文件夹内,新创建一个Object文件夹。并在其中创建Materials和Texture文件夹(分别自动存放材质球和贴图)。模型物体并列保存在Object文件夹内。这个规律模式不要打乱,否则会破坏整个系统逻辑。
4.材质数量控制
如果一个物体给与一个材质球,那么Unity3D对于材质数量和贴图数量没有任何的限制。如果一个物体给与多个材质球,我们需要用Multi/SubObject来实现,但是这种罗列的材质球的数量没有严格的控制,但尽量保持在10以内,过多的数量会导致一些错误。如果不使用Multi/SubObject材质球,也可以选择一些面,然后给与一个材质球。这样系统会自动将其转换成Multi/SubObject材质。综合而言Unity3D软件对于材质的兼容还是很好的。
5.物体的质感
Diffuse Diffuse Bumped Bumped Specular
这三种类型为常用类型,其中Bumped需要增加Normal法线贴图来实现凹凸。
Decal
这种材质为贴花材质,即相当于Mask类型,可以再Decal(RGBA)贴与一个带有Alpha通道的图像,形成和原图像相叠加的效果。
Diffuse Detail
这种材质可以创造出污迹和划痕的效果,即相当于Blend混合材质。
Reflective
其中各种类型可以创造出金属反射效果,需要增加Cubmap贴图。
Transparent
其中各种类型可以创造出透明的效果,需要增加具有Alpha的通道贴图。
注意:如果要做玻璃贴图,Alpha如果全是灰色或黑色(即要求全透明),那么Alpha就会失效,如果要全透明,材质Alpha其中必须至少有1像素为白色。
Nature
其中SoftOcclusion Leaves类型主要应用于片状的树叶材质。
6.物体尺寸
默认情况下U3D系统单位1等于1米,等于软件1单位。如果我们制作是按照实际大小比例制作,那么导入U3D引擎会自动变成原来的1%的大小。因为默认情况下,U3D的FBXImporter中的Scale Factor的数值为0.01。那个我们可以将ScaleFactor的数值恢复为1,但是这样会占用模型资源,比较消耗物理缓存。我们也可以将这个物体从Hierarchy中选择,并使用Scale放大100倍,这种设置可以有很多好处,并且还能通过用脚本制作动画。
7.关于复制
场景中的灯光布局,重复的模型物体都可以使用系统Prefab进行关联复制,这样可以改变一个参数的同时将所有关联物体属性改变。
8.山脉控制
在创建山脉之后,选择Terrain/Set Resolution可以设置山脉的大小和属性。需要注意的是,默认情况下TerrainWidth和Terrain Height为1000米。如果设置这个数值太小,那么绘制草的时候会产生偏移,因为草的尺寸必须减少到0.1的单位。也就是说,山脉在处理0.1单位的时候会产生0.01的偏差,如果模型太小,这种偏差是显而易见的,所以建议用户不要让模型过小。
9.光晕控制
光晕又称为Lens Flare即灯光光效。可以选择一个GameObject物体给与Component/Rendering/LensFlare,并在Flare中增加一个StandardAssets/Light Flares/50mm Zoom项目。这样在运行之后就会产生光晕。但有时候如果光晕太远太高却看不到。一种办法是将光晕离近,另一种办法是将所有摄影机Camera的Far clip plane的数值增加。
10.摄影机控制
如果场景中有多架摄影机,那么如何确定第一打开时间所显示的摄影机,就需要设置Camera属性中的Depth数值,数值越大的摄影机越优先显示。
1:天空盒有接缝怎么解决?
答:在贴图导入设置里设置Wrap Mode为"Clamp".
2:DDS格式怎么不显示?
答:Unity不支持DDS格式,Unity会将除DDS外的其他格式图片具有为DDS同样的优化.
3:Unity如何动态载入外部模型等文件?
答:可以使用AssetBundle:http://unity3d.com/support/docum ... ce/AssetBundle.html
4:脚本编辑器有语法提示吗?
答:有的,Win版使用Ctrl+I,Mac版使用Ctrl+>.
5:如何使用烘焙贴图(多重纹理)?
答:不要使用Shell贴图,直接将烘焙图赋予贴图的"自发光"通道之上.
6:怎么屏蔽Webplayer右键菜单?
答:<param name="disableContextMenu" value="true" />
7:为什么水面没有实时反射效果?
答:只有专业版才支持这种反射效果.
8:怎么做摄像机漫游动画?
答:Max正常制作摄像机漫游动画,倒到Unity中后,将Unity的Camea拖拽到Max导出的摄像机Gameobject物体之上,作为其子物体即可.
9:如何自定义Webplayer载入Logo及进度条?
答:<param name="logoimage" value="Logo文件名" />,<param name="progressbarimage" value="进度条名" />,<param name="progressframeimage" value="进度条外框名" />.
10:GUI上怎么使用中文字?
答:导入任意中文字体,然后定义GUISkin字体为该字体即可.
11:购买一个授权可以安装几台电脑?
答:可以安装于2个系统之上比如一个Win版一个Mac版.
12:Max文件扔到Unity中怎么说导入失败?
答:下载最新版Fbx插件,用Max导出Fbx文件然后扔Unity中.
13:如何不让摄像头穿透模型,离模型近了就像模型露面了?
答:设置相机的Near clip plane,调小一点,但是不要给负数.
14:怎么用双面贴图?
答:Unity中可设置双面Shader,最简单有效的办法是直接做成双面的实体模型.
15:导入的Fbx模型尺寸小于Max中的尺寸?
答:在Unity中该文件的导入设置中设置缩放因子为1.
16:如何给相机添加Glow效果?
答:选中相机对象,在菜单中选中Component-Image Effects-Glow赋予该组件即可(专业版才支持此特效)
17:怎么设置Webplayer默认尺寸?
答:到菜单Edit-Project Settings-Player中设置Default Web Screen尺寸即可.
18:怎么设置可执行文件的启动Banner?
答:到菜单Edit-Project Settings-Player中设置Resolution Dialog Banner.
19:如何设置雾效?
答:到菜单Edit-Render Settings中开启Fog及设置Fog Color等即可.
20:如何设定默认Skybox天空盒?
答:到菜单Edit-Render Settings中设置Skybox Material即可.
strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切
@property (nonatomic, strong) NSString *string1;
@property (nonatomic, strong) NSString *string2;
有这样两个属性,
@synthesize string1;
@synthesize string2;
猜一下下面代码将输出什么结果?
self.string1 = @"String 1";
self.string2 = self.string1;
self.string1 = nil;
NSLog(@"String 2 = %@", self.string2);
结果是:String 2 = String 1
由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。
接着我们来看weak关键字:
如果这样声明两个属性:
@property (nonatomic, strong) NSString *string1;
@property (nonatomic, weak) NSString *string2;
并定义
@synthesize string1;
@synthesize string2;
再来猜一下,下面输出是什么?
self.string1 = @"String 1";
self.string2 = self.string1;
self.string1 = nil;
NSLog(@"String 2 = %@", self.string2);
结果是:String 2 = null
分析一下,由于self.string1与self.string2指向同一地址,且string2没有retain内存地址,而self.string1=nil释放了内存,所以string1为nil。声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针。在c/c++开发过程中,为何大牛都说指针的空间释放了后,都要将指针赋为NULL. 在这儿用weak关键字帮我们做了这一步。
//C++单例模式:指一个类只生成一个对象
#include <iostream>
using namespace std;
class A{
public:
static A* getA();
static A* a;
int b = 0;
void funAdd(){
b++;
cout<<b<<"\n";
};
void funClear(){
b = 0;
}
};
A *A::a = NULL;
A *A::getA()
{
if (a == NULL) {
a = new A;
}
return a;
}
int main(int argc, const char * argv[])
{
for (int i=0; i<10; i++) {
(A::getA())->funAdd();
if (i == 4) {
(A::getA())->funClear();
}
}
return 0;
}
Student.h:
#import <Foundation/Foundation.h>@interface Student : NSObject@property(nonatomic,retain) NSString * name;@property(nonatomic,assign) int age;@end
Student.m:
#import "Student.h"@implementation Student//动态方法,在main函数中类alloc了之后调用,但是要手动管理内存,要手动释放-(id) initWithAge:(int)age{if (self == [super init]) {_age = age;}return self;}//静态构造方法,在main函数中不需要你手动管理内存释放+(id)studentWithAge:(int)age{Student *stu = [[[Student alloc] init] autorelease];\stu.age = age;return stu;}-(NSString *)description{return [NSString stringWithFormat:@"name:%@ age:%i创建了",_name,_age];}-(void)dealloc{NSLog(@"name:%@ age:%i被释放了",_name,_age);[_name release];[super dealloc];}@end
main
1 #import <Foundation/Foundation.h>2 3 #import "Student.h"4 5 int main(int argc, const char * argv[])6 7 {8 9 @autoreleasepool {
10
11 //动态方法需要手动释放内存
12
13 Student *stu1= [[Student alloc] initWithAge:10];
14
15 stu1.name = @"dingxiaowei";
16
17 NSLog(@"%@",stu1);
18
19 [stu1 release];
20
21 //静态构造方法不需要你管理内存
22
23 Student *stu2 =[Student studentWithAge:20];
24
25 stu2.name = @"wangning";
26
27 NSLog(@"%@",stu2);
28
29 }
30
31 return 0;
32
33 }
Unity3D项目开发一点经验相关推荐
- 使用Unity开发项目的一点经验
使用Unity开发项目的一点经验 我们主要使用3dsmax2010进行制作,输出FBX的类型导入Unity3D中. 默认情况下,3dsmax8可以和U3D软件直接融合,自动转换为FBX物体. 注意事项 ...
- 项目开发安全经验总结
项目开发安全经验总结 1. 安全思维 2. Linux/Windows服务器安全 a) 系统安全 b) 权限控制 c) 定时检测 d) 记录操作日志,定时保护日志 3. Nginx/Apache安全 ...
- java项目开发实践经验每日总结(2014/2/22)
2014/2/22 1.阅读分析代码可以从需求逻辑层,业务逻辑层,目录结构层,包结构层,类结构层,方法结构层,代码结构层,方法实现结构层,语法结构层 2.单页的代码结构 所属包,导入文件和包,公共类( ...
- 基于J2EE架构的项目开发团队中的角色与职责
[声明] 1.2内容来源:<J2EE Architects Handbook>中文翻译<J2EE系统架构师参考手册>[翻译 Mellon] 1.角色 Technical arc ...
- Unity3D如何开发最简单的VR游戏 vrPlus(神之眼)
VR是一种可创建和体验虚拟世界(Virtual World)的计算机系统, 是一种可以创建和体验虚拟世界的计算机仿真系统.它利用计算机生成一种模拟环境,是一种多源信息融合的交互式三维动态视景和实体行为 ...
- 视频教程-虚拟现实之汽车模拟仿真项目开发-Unity3D
虚拟现实之汽车模拟仿真项目开发 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件架构设计理论.精 ...
- 100个vc小项目开发:二、一步一点设计音乐播放器 [I]
100个vc小项目开发:二.一步一点设计音乐播放器 [源码解读] 文章作者: July 软件来源:开源 ================== 1.有不正之处,恳请指正. 2.本文贴出的是关键实现代码部 ...
- 【经验】Qt项目开发必备工具
在实际的项目中,除了需要掌握Qt开发框架本身,还需要掌握一些开发工具.这些工具能起到事半功倍的效果,甚至某些工具是开发不可或缺的.下面笔者就介绍一些常用的开发工具的用法及下载地址,希望对缺少实际项目经 ...
- gitee项目能用SVN拉取吗_使用Git开发维护Github开源项目的一些经验
Github无法访问/访问慢的经验 github经常会因为一些原因抽风,无法访问,这时候,可以使用gitee同步github项目,然后从gitee拉项目.在gitee导入项目以后,项目名称后面有个同步 ...
最新文章
- 【FFmpeg】ffmpeg命令详解(二)
- juniper M320路由器基本配置
- 网络编程学习笔记(getnameinfo函数)
- Windows Phone 7 MVVM模式通讯方式之实现Command
- PAT甲级1062 Talent and Virtue:[C++题解]结构体、哈希表
- 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务
- go语言io reader_【已解决】go语言中如何使用io的MultiWriter
- ECC椭圆曲线加密算法原理
- 记录C++ Builder 6.0开发过程中的一个linker error
- 洛谷—— P1069 细胞分裂
- 7.2 Flowable 背压
- 【参赛作品65】MOGDB/openGauss的txid_snapshot 数据类型和相关函数
- QT下载和安装 指南教程
- 围城---一段不错的观后感
- android开发基础2-基本UI组件(明日科技教程)
- 失眠是怎么回事?睡眠障碍的诊断与治疗
- 自然科学计算机技术ppt,[自然科学]图像处理.ppt
- 众筹网站项目第四天之异步请求的分页查询和模糊条件查询(2)
- 乌克兰启动国家政策使加密货币合法化
- 现在转行做程序员还有必要吗,培训班有必要去吗?
热门文章
- 上帝掷骰子吗?量子物理史话-序篇
- Abp框架从零开始(基于.Net Core 2.2) 小记(三) 将EF生成调用的Sql语句打印到控制台
- 从Word Embedding到Bert模型---NLP中预训练发展史
- STM32F427VGT6替代方案 | GD32F450VGT6系统板相关硬件信息
- IFTTT在开发环境中使用Docker的经验
- 扫描仪(Scanner)用法
- 局域网的网络硬件主要包括有什么
- 日本人是这样做游戏的!
- delve应该安装到哪_Go调试工具—— Delve
- MicroNet:一种轻量级神经网络架构