Unity 基础知识总结(持续更新中...)

发布于:2025-03-11 ⋅ 阅读:(20) ⋅ 点赞:(0)

引擎基础

Unity有哪几个主要窗口?

Scene窗口

用于场景搭建和UI界面拼接

Game窗口

游戏运行预览

Hierarchy窗口

查看和调整场景对象层级结构

Project窗口

游戏工程资源

Inspector创建

属性查看器,属性设置、脚本组件挂载

Unity提供了几种光源,分别是什么

一共有四种

  1. Directional Light 平行光
  2. Point Light 点光源
  3.  Spot Light 聚光灯
  4. 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画布的渲染模式

  1. Screen Space-Overlay:所有UI元素都渲染在场景中的最上层
  2. Screen Space-Camera:画布放置在指定摄像机前面的给定距离处。场景中的物体可以显示在UI前面
  3. 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 :世界坐标系中的位置