Unity3d面试7:泛型;

http://www.taidous.com/bbs/thread-37143-1-1.html

Unity问答第4期

1,FixedUpdate(),Update(),LateUpdate()的用法与区别。

1,当程序启用时,Update()是在每一帧被调用。
2,当程序启用时,FixedUpdate()是在每一固定帧被调用。
3,当程序启用时,LateUpdate()也是在每一帧被调用,但不同的是它是在所有Update()调用后才会被调用。
4,区别总结:

Update跟当前平台的帧数有关系每一帧的时间不是固定的,而FixedUpdate是真实的时间固定值,所以一般物理逻辑都会放在FixedUpdate中。

而LateUpdate是在所有Update调用后才会被调用,在同一帧中有多个Update,一个LateUpdate也是Update会先执行。例如相机跟随等。
PS:FixedUpdate的时间间隔可以在项目设置中更改,Edit->ProjectSetting->time  找到Fixedtimestep。就可以修改了。

2,Unity中的1单位是FBX文件中的1单位的几倍?

Unity中的1单位是fbx文件中的1单位的100倍,所以我们想Unity中使用1单位=1米的话,那在Max和Maya中制作的时候,单位就设置成1厘米,

3,为了减少性能开销,移动端实现实时阴影的方法是什么?

由于移动端性能的限制,所以不能用自带的DirectionalLight来设置实时阴影,SO如下:
1,贴图的方式,如果不需要很真实的阴影可以脚下绑定个半透贴图脚本控制来模拟阴影效果,对于材质写一个简单的Shader就行了。

Shader "iPhone/SimpleShadow"
{
        Properties
        {
                _MainTex ("MainTex", 2D) = "" {}
        }

        SubShader
        {
                Tags { "Queue" = "Transparent" }

                Pass
                {
                        Blend SrcAlpha OneMinusSrcAlpha
                        
                        Color [_clrBase]
                        
                        Cull Off
                        Lighting Off
                        SetTexture [_MainTex] { combine texture, one - texture }
                }
        }
}
2,利用相机投射,在游戏主角身上绑定个专门投射的正交相机每帧实时绘制,用Render Texture来接收,也是脚下绑定个面片Plane Quad之类的,这个方式可以有更真实的实时阴影,因为身上会有一个特效之类的透明材质所以要在Shader中来进行处理,使用这个方法的一些注意事项,多人重叠时阴影会多次渲染,所以简单的方法就是给阴影分层处理,单独的投影。还有一点就是跳跃问题因为是脚下绑的面片所以用代码的方式控制跳跃就会出现阴影跟人一起跳跃的状态,所以要注意这一点人物的跳跃可以用动画的方式来实现。这一点在上一种方式也是一样的,还有就是这两种方式都不适合与复杂凹凸的地形阴影会出现奇葩效果。
由于这里代码太多就不贴出来了,大概就是绘制阴影的Shader,相机投射的脚本,跟相机跟随的脚本。详情也可以去泰课的格斗之王60,61,62课去看看。
3,投影生成的方法,在Unity中为我们提供了Projector组件。具体实现方式可参考链接 http://jxwgame.blog.51cto.com/943299/1596781
4,一张图片的像素格式为512*512,若每个像素占4位,存储这张图片的大小为多少KB/MB?
512*512*4=262144*4=1048576(byte)=1024(Kb)=1(M),属于常用纹理 A8R8G8B8像素格式。

5,Unity5.X版本中,如何添加GUI Text组件?是否有其他更好的方法代替它?(新手常见问题)


在Unity5.X以后UI系统已经更新成了UGUI,添加UI-Text代替老版本的GUI Text。

6,项目导入一张图集后,如何在Unity中使用?(变成一张一张的小图)

答:

1.点中这个图集在 Inspector面板中设定其参数  TextureType = Sprite; SpriteMode = Multiple; 并Apply.

2.然后在选中此纹理,打开SpriteEditor面板,点击左上角Slice按钮。

3.选择Automatic 或Grid模式进行对此图元素进行切割。 如果是规则的i*j 并且是同尺寸的集合可以选用Grid.否则请选择 Automatic,

4.此时就可以对单个精灵进行编辑了。


7,当一个物体在视野内被其它物体遮挡,不希望对该物体进行渲染,可以通过哪一个模块实现?
Occlusion Culling遮挡剔除,这个板块在专业版中,选择Window->Occlusion Culling。
Occlusion Culling 也是一个特性,让不可见的物体不被渲染,但这个不是自动发生,这个和摄像头的平截头体的剔除是不一样的,摄像头的平截头体只是不渲染不在可视范围内的物体,但是它不会禁止一些不可见物体的重画。
遮挡剔除和平截头体剔除不相互矛盾。遮挡剔除会在场景中使用一个虚拟摄像头去组织可见物体的层次,这样unity可以根据这个信息确定哪些物体需要被渲染,大大减少draw call的次数,提高性能。具体参数百度一堆就不画蛇添足了。

8,值类型和引用类型的区别?
1,C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型
 
 C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。
2,值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。
3,值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
4,栈的内存分配是自动释放;而堆在.NET中会有GC来释放 
5,值类型存取速度快,引用类型存取速度慢。
6,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
7,值类型继承自System.ValueType,引用类型继承自System.Object

9,什么是泛型?请举一个通俗易懂的例子
答:通俗来说泛型就是类的一个参数,但是这个参数必要要求是1个类,而不是一个对象。即通过参数化类型来实现在同一份代码上操作多种数据类型

通过参数化类型来实现在同一份儿代码上操作多种数据类型。

public class GenercList<T>
{
	void Add(T input)
	{
	}
};

class Test
{
	static void Main()
	{
		GenercList<int> listInt = new GenercList<int>();
		GenercList<string> listString = new GenercList<string>();
	}
};

优点是:

1,算法的重用性;

2,数据的类型安全;

3,减少装箱拆箱的操作。

10.下列代码在运行中会发生什么问题?如何避免?

List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });
foreach (int item in ls)
{
        Console.WriteLine(item * item);
        ls.Remove(item);
}

foreach只会只读,并不能一边遍历列表一边修改值。

可以临时构建在foreach外在进行删除。
还可以用for来遍历如下,List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取,每移除一个元素以后再把i移回来就可以了。还可以倒过来遍历代码简单就不都贴了。

List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });
for(i=0;i<Is.Count;i++)
{
        Console.WriteLine(item * item);
        ls.Remove(item);
        i=i-1;
}












  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值