引擎基础
Unity有哪几个主要窗口?
Scene窗口 | 用于场景搭建和UI界面拼接 |
Game窗口 | 游戏运行预览 |
Hierarchy窗口 | 查看和调整场景对象层级结构 |
Project窗口 | 游戏工程资源 |
Inspector创建 | 属性查看器,属性设置、脚本组件挂载 |
Unity提供了几种光源,分别是什么
一共有四种
- Directional Light 平行光
- Point Light 点光源
- Spot Light 聚光灯
- Area Light区域光
Image和RawImage有啥区别?
1、Image比RawImage更消耗性能
2、Image只能Sprite精灵图片,而RawImage可以显示任何纹理
3D碰撞器有哪些?
共有6种:
BoxCollider | 盒子碰撞器 |
SphereCollider | 球体碰撞器 |
CapsuleCollider | 胶囊碰撞器 |
WheelCollider | 车轮碰撞器 |
MeshCollider | 网格碰撞器 |
TerrainCollider | 地形碰撞器 |
2D碰撞器有哪些?
共有6种
BoxCollider2D | 盒子碰撞器 |
CircleCollider2D | 圆圈碰撞器 |
CapsuleCollider2D | 胶囊碰撞器 |
EdgeCollider2D | 边缘碰撞器 |
PolygonCollider2D | 多边形碰撞器 |
CompositeCollider2D | 组合碰撞器 |
简述一下prefab的用处?
1、方便协同工作,美术、策划可以进行修改和调整。
2、相当于一个具有相同参数模板,方便我们搭建场景和拼接界面,提高开发效率。
3、方便我们在场景中通过代码进行实例化
碰撞器和触发器有什么区别?
碰撞器是触发器的载体,触发器是碰撞器身上的一个属性
碰撞器有碰撞效果,IsTrigger = false,可以调用OnCollisionEnter/OnCollisionStay/OnCollisionExit函数
触发器没有碰撞效果,IsTrigger = true,可以调用OnTriggerEnter/OnTriggerStay/OnTriggerExit函数
Unity的渲染管线的类型有哪些?
名词 | 简称 | 描述 |
Built-in Render Pipeline | BRP | 内置渲染管线 |
Universal Render Pipeline | URP | 通用渲染管线 |
High Definition Render Pipeline | HDRP | 高清渲染管线 |
Scriptable Render Pipeline | SRP | 自定义渲染管线 |
物体发生碰撞效果的必要条件?
双方都要添加碰撞体,任意一方添加刚体组件
发生触发检测的条件?
双方都要添加碰撞体,任意一个方勾选IsTrigger属性,运动的一方添加刚体组件
移动相机动作在哪个函数里,为什么在这个函数里?
LateUpdate,是在所有的update结束后才调用,比较适合于控制脚本的执行顺序。官网上例子是摄像机的跟随,都是所有的update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
骨骼动画有哪些类型?
1、None:不存在动画的模式
2、Legacy:旧版动画模式
3、Generic:通用动画模式,适用于人形或非人形
4、Humanoid:人形角色动画模式,只适用于人形
Canvas画布的渲染模式
- Screen Space-Overlay:所有UI元素都渲染在场景中的最上层
- Screen Space-Camera:画布放置在指定摄像机前面的给定距离处。场景中的物体可以显示在UI前面
- World Space:应用:让Canvas更像一个游戏对象,可以在场景中移动,常用于制作跟随角色的血条
什么叫做链条关节?
Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
图片的类型有哪些将图片的TextureType选项分别选为Texture和Sprite有什么区别
Sprite作为UI精灵使用,Texture作用模型贴图使用。
Animation和Animator的区别
Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的。Animation控制一个动画的播放,而Animator是多个动画之间相互切换,并且Animator有一个动画控制器,俗称动画状态机。
Animator利用它做动画的切换是很方便的,但是它有一个缺点就是占用内存比Animation大。
MeshRender中material和sharedmaterial的区别?
答:修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。 不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。
脚本基础
脚本生命周期
事件函数的执行顺序 - Unity 手册
Awake | 始终在任何 Start 函数之前并在实例化预制件之后调用此函数。(如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用 Awake。)在加载场景时调用,用于脚本初始化 |
OnEnable | (仅在对象处于激活状态时调用)在启用对象后立即调用此函数。在创建 MonoBehaviour 实例时(例如加载关卡或实例化具有脚本组件的游戏对象时)会执行此调用。 |
Reset | 调用 Reset 可以在脚本首次附加到对象时(Editor状态) |
Start | 仅当启用脚本实例后,才会在第一次帧更新之前调用 Start。用于实例化,Awake之后Update之前 |
FixedUpdate | 固定帧(固定的时间间隔,不受帧率(FPS)影响)更新,更新频率默认为0.02s.FixedUpdate比较适用于物理引擎的计算。 |
Update | 用于逻辑运算 |
LateUpdate | 在Update之后调用,用于调整脚本执行顺序,或者LateUpdate 的常见用途是跟随第三人称摄像机。 |
OnGUI | 每帧调用多次以响应 GUI 事件。首先处理布局和重新绘制事件,然后为每个输入事件处理布局和键盘/鼠标事件。 |
OnDisable | 行为被禁用或处于非活动状态时,调用此函数。 |
OnDestroy | 当MonoBehaviour将被销毁时,被调用 |
控制角色移动有哪些方法?
【Unity入门】物体5种移动方法_1、unity3d中实现游戏物体位置变化的几种方法?-CSDN博客
public float speed;
public float jumpHeight;
if (Input.GetKey(KeyCode.W))
{
transform.position += new Vector3(0,0,speed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
transform.position += new Vector3(0,0,-speed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.A))
{
transform.position += new Vector3(-speed*Time.deltaTime,0,0);
}
if (Input.GetKey(KeyCode.D))
{
transform.position += new Vector3(speed*Time.deltaTime,0,0);
}
if (Input.GetKeyDown(KeyCode.Space))
{
transform.position = new Vector3(0,jumpHeight,0);
}
if (Input.GetKey(KeyCode.W))
{
// transform.position += new Vector3(0,0,speed*Time.deltaTime);
transform.Translate(Vector3.forward*speed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
// transform.position += new Vector3(0,0,-speed*Time.deltaTime);
transform.Translate(Vector3.back*speed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.A))
{
// transform.position += new Vector3(-speed*Time.deltaTime,0,0);
transform.Translate(Vector3.left*speed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))
{
// transform.position += new Vector3(speed*Time.deltaTime,0,0);
transform.Translate(Vector3.right*speed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.W))
{
rb.AddForce(0,0,speed*Time.fixedDeltaTime);
}
if (Input.GetKey(KeyCode.S))
{
rb.AddForce(0,0,-speed*Time.fixedDeltaTime);
}
if (Input.GetKey(KeyCode.A))
{
rb.AddForce(-speed*Time.fixedDeltaTime,0,0);
}
if (Input.GetKey(KeyCode.D))
{
rb.AddForce(speed*Time.fixedDeltaTime,0,0);
}
private CharacterController cc;
cc = GetComponent<CharacterController>();
if (Input.GetKey(KeyCode.W))
{
cc.Move(Vector3.forward*speed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
cc.Move(Vector3.back*speed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.A))
{
cc.Move(Vector3.left*speed*Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))
{
cc.Move(Vector3.right*speed*Time.deltaTime);
}
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
transform.Translate(horizontal*speed*Time.deltaTime,0,vertical*speed*Time.deltaTime);
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
transform.position += new Vector3(horizontal*speed*Time.deltaTime,0,vertical*speed*Time.deltaTime);
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
rig.AddForce(horizontal*speed*Time.fixedDeltaTime,0,vertical*speed*Time.fixedDeltaTime);
PlayerPrefs有哪些常用API?
PlayerPrefs类是一个本地持久化保存与读取数据的类
PlayerPrefs类支持3中数据类型的保存和读取,整形,浮点型,和字符串型
PlayerPrefs.SetInt("整型",250);
PlayerPrefs.GetInt("整型",438);
PlayerPrefs.SetFloat("浮点型",3.14f);
PlayerPrefs.GetFloat("浮点型", 3.333f);
PlayerPrefs.SetString("字符串","清一色");
PlayerPrefs.GetString("字符串", "大三元");
获取、增加、删除组件的命令分别是什么?
介绍一下协程,协程有什么作用?
定义:协同程序,即在主程序运行的同时开启另一段逻辑处理来协同当前的程序执行,所有的协同程序都是在主线程中运行的,它还是一个单线程程序。在Unity中通过StartCoroutine方法来启动协同程序。使用yield关键字来中断协同程序
作用:
用于在单一线程上执行多个任务,实现异步等待和延迟执行等效果
协程可以在不创建新线程的情况下实现异步等待和延迟执行,避免了线程切换和同步等问题,从而提高了程序的性能和效率。在Unity中,协程通常用于处理一些异步任务,比如等待一段时间、播放动画、加载资源等。协程是辅助主线程的操作,避免游戏卡顿。
简述CharcaterController和Rigidbody的区别?
Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的。
localPosition 与 Position 的使用区别?
localPosition :自身坐标系,相对于父级的位置
Position :世界坐标系中的位置