Unity 面试题(三)

第三部分

1.什么是渲染管道?

渲染管线执行一系列操作来获取场景的内容,并将这些内容显示在屏幕上.
渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要步骤有:
本地坐标 -> 世界坐标 -> 相机视图坐标 ->根据投影方式不同,获取坐标,进行归一化,剪裁->视口坐标变换

2.如何优化内存?

有很多种方式,例如:

1. 压缩自带类库;

2. 将暂时不用的以后还需要使用的物体隐藏起来而不是直接 Destroy 掉;

3. 释放 AssetBundle 占用的资源;

4. 降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;

5. 使用光照贴图,使用多层次细节 (LOD) ,使用着色器 (Shader) ,使用预设(Prefab) 。

3、动态加载资源的方式?(有时候也问区别,具体请百度)

1.Resources.Load();

2.AssetBundle

4、什么是协同程序?

1、协程是一个主线程分部执行程序,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。
2、Unity在每一帧(Frame)都会去处理对象上的协程。Unity主要是在Update后去处理协程(检查协程的条件是否满足),但也有写特例。

5、你用过哪些插件?

( 最好多熟悉几个插件,问的时候好回答 )

2.碰撞检测需要物体具备什么属性?

OnCollider碰撞条件:
两个物体都要有Collider
两者之一,需要有Rigidbody(最好是添加脚本的那个物体是主动碰撞的物体,添加RigidBody;被碰撞的物体添加RigidBody,碰撞事件不明显)
有Rigidbody组件的那方,会受力的作用,发生位移或形变(勾选use gravity 受力明显,不勾选不明显)(勾选 is kinematic 不发生碰撞,不要勾选)

OnTrigger碰撞条件:
两个物体都要有Collider
两者之一,需要添加RigidBody
两者之一,需要勾选IsTrigger
但是都不会受力的作用,都不会发生位移或形变

OnTrigger的碰撞与OnCollider是不同的:
is Trigger,如果勾选了该属性,那么该物体就是一个虚体,有形而无实,不受力的作用,其它对象可以穿过它,不会产生形变。
Collider就不会穿过,会产生形变。

5.获取、增加、删除组件的命令分别是什么?

获取: GetComponent
增加: AddComponent
删除: Destroy

6.Animation.CrossFade命令作用是:(C)

A. 动画放大 B. 动画转换 C. 动画的淡入为其他动画

7.Application.loadLevel命令为:(A)

A. 加载关卡 B. 异步加载关卡 C. 加载动作

8.调试记录到控制台的命令是什么?

Debug.Log();

9.编辑器类存放路径是什么?

工程目录下的 Assets/Editor 文件夹下。

10. 使用原生 GUI 创建一个可以拖动的窗口命令是什么?

GUI.DragWindow();

11.localPosition 与 Position 的使用区别?

localPosition :自身位置,相对于父级的变换的位置。 
Position :在世界坐标transform 的位置

12. 意义连线

Mathf.Round   四舍五入

Mathf.Clamp   限制

Mathf.Lerp     插值

15. 怎么拿到一个对象上脚本的方法

GameObject.GetComponent<>();

16. 上机题 : 用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放 ( 用一个Cube 即可 ) 。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 滚动鼠标滚轮缩放物体,此脚本放在主相机上
/// </summary>
public class Scroller : MonoBehaviour
{
	// Update is called once per frame
	void Update()
	{
		if (Input.GetAxis("Mouse ScrollWheel") < 0)
		{
			if (Camera.main.fieldOfView < 100)
				Camera.main.fieldOfView += 2;
			if (Camera.main.orthographicSize <= 20)
				Camera.main.orthographicSize += 0.5f;
		}
		if (Input.GetAxis("Mouse ScrollWheel") > 0)
		{
			if (Camera.main.fieldOfView > 2)
				Camera.main.fieldOfView -= 2;
			if (Camera.main.orthographicSize >= 1)
				Camera.main.orthographicSize -= 0.5f;
		}
	}
}

using System.Collections;
using UnityEngine;

/// <summary>
/// 鼠标拖拽物体移动,将此脚本放置需要拖拽的物体上
/// </summary>
public class MouseDragObject : MonoBehaviour
{

	void Start()
	{
		StartCoroutine(OnMouseDown());
	}

	IEnumerator OnMouseDown()
	{
		//1.获取物体position word->screen
		//写在外面是因为,在获取这个值只获取按下去时的一次就够了
		Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三维物体坐标转屏幕坐标

		while (Input.GetMouseButton(0))
		{
			//2.最终的物体的Z坐标要与物体的Z坐标一致,才能得到我们要的效果
			Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);

			//3.将最后的坐标 从Screen -> Word ,赋值给物体
			transform.position = Camera.main.ScreenToWorldPoint(curScreenSpace);

			//4.跟着FixedUpadate,后面循环,常用于物理运动
			yield return new WaitForFixedUpdate(); 
		}

	}


}

1,在类的构造函数前加上static会报什么错?为什么?

构造函数格式为 public+ 类名如果加上 static 会报错(静态构造函数不能有访问修饰符) 
原因:静态构造函数不允许访问修饰符,也不接受任何参数;   
无论创建多少类型的对象,静态构造函数只执行一次;   
运行库创建类实例或者首次访问静态成员之前,运行库调用静态构造函数;   
静态构造函数执行先于任何实例级别的构造函数;   
显然也就无法使用 this 和 base 来调用构造函数。 

2 , C# String 类型比 stringBuilder 类型的优势是什么 ?

String 对字符串修改数量很少时,或者具有大量搜索操作事使用。
StringBuilder 主要拼接大量字符串时,或者对字符串进行大量修改时使用。

3 , C# 函数 Func(string a, string b) 用 Lambda 表达式怎么写 ?

Func(string,string) IsEquals = (x,y) =>x==y;
Func(参数类型,参数类型) 方法名=(参数1,参数2)=> 方法内容;

4, 数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现

通项公式应该是 an = a(n-1) + a(n-2)

a3=2=1+1 
a4=3=1+1+1 
a5=1+1+1+2 
a6=1+1+1+2+3 
......... 
an=1+1+1+2+3+...+(n-2)+(n-3) 
=2+(n-2)(n-3)/2 (n>=3) 这是通项公式,至于递归? …

5,一个简单的游戏,怪物会走动\攻击\死亡,游戏角色会走动,跳跃\攻击\格挡\死亡,还会接受玩家从输入端输入的指令,NPC会走动,他们彼此之间可以互相通信.请画出以上三种角色的UML图示.

6 , NGUI Button 怎样接受用户点击并调用函数 , 具体方法名称是什么

OnClick()、OnPress()等

7 ,怎么判断两个平面是否相交 ? 不能用碰撞体 , 说出计算方法

“垂直于同一条直线的两个平面平行,而两个平面不平行,则一定相交;
计算一个平面的法向量,再判断法向量是否垂直于另一个平面;
不垂直则相交

8, <愤怒的小鸟>给予初速度以后,怎么让小鸟受到重力和空气阻力的影响而绘制抛物线轨迹,说出具体的计算方法.

  Vector3 v 代表初速度 v' 代表现在的速度,假设小鸟是沿的 z 轴也就是transform.forward 方向运动的质量为 1 ,那么 v‘=v-new Vector3(0,g*t,f*t) ,transform.Translate(v') 做的就是抛物线运动( g 为重力加速度不要用现实中的需要自己调试, f 为阻力也要自己调试设置, t 为时间)

9.C# 委托是什么?

 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。

10.ref 和 out 的区别:

 ref :有进有出
 out:只出不进

ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。

来源: https://blog.csdn.net/chizangtuo3823/article/details/100938093

posted @ 2021-09-13 16:21  倩倩成长史  阅读(168)  评论(0)    收藏  举报