Unity常用API方法与类+物体移动、旋转方法+习题

每日一句:要么出众,要么出局

目录

常用API方法与类详细讲解

Reset()

Awake()

OnEnable()

Start()

Update()

LateUpdate()

OnDisable()

OnApplicationQuit()

OnDestory()

创建游戏物体的方式

游戏物体的获取与查找

MonoBehaviour(基类)

Transform

Vector2

访问输入系统的接口类

鼠标行为检测的回调事件

动画

Time

Mathf

Random类

协程

2D刚体类的成员变量与方法

Audio Source组件

资源的动态加载

旋转物体方法

移动物体方法

习题:


常用API方法与类详细讲解

Reset()

调用时间:当脚本第一次挂载到对象身上或者使用了Reset命令之后会调用一次

调用次数与作用:初始化脚本的各个属性,Reset最常用于在检视面板中提供良好的默认值

调用情况:此函数只能在编辑器模式下(不运行)调用

Awake()

调用情况:

  1. 在加载场景时初始化包含脚本的激活状态的GameObject时
  2. GameObject从非激活状态转变为激活状态
  3. 在初始化使用Instantiate创建的GameObject之后

调用时间、次数与作用

在脚本实例的生存期内,Unity仅调用一次,脚本的生存期持续到包含它的场景

Unity调用的每个GameObject的Awake的顺序是不确定的,人为干涉(即设计)来保证程序

Awake来代替构造函数进行初始化,在Unity里组件的初始化不使用构造函数

OnEnable()

调用情况:

  1. 游戏物体被激活
  2. 脚本组件被激活

调用时间、次数与作用

每次游戏物体或脚本被激活都会调用一次

即使重复赋值,还会变为初始状态

Start()

调用情况

a.游戏物体被激活

b.脚本组件被激活

调用时间、次数与作用

在脚本实例激活时,第一帧的Update之前被调用,后于Awake执行,方便控制逻辑的前后调用顺序

对变量赋值的顺序:(后赋值会覆盖先赋值的)

变量声明并直接赋值>检视面板赋值>Awake>OnEnable>Start>外部赋值

Update()

调用情况

a.游戏物体被激活

b.脚本组件被激活

调用时间、次数与作用

每帧调用

实时更新数据,接受接入数据

LateUpdate()

调用情况

a.游戏物体被激活

b.脚本组件被激活

调用时间、次数与作用

LateUpdate在调用所有Update函数后调用,安排脚本的执行顺序

OnDisable()

调用情况

  1. 游戏物体被禁用
  2. 脚本组件被禁用
  3. 游戏物体被销毁

调用时间、次数与作用

满足调用情况时,即时调用一次,用于处理一些对象的状态重置,资源回收与清理

OnApplicationQuit()

调用情况

  1. 在程序退出之前所有游戏对象都会调用这个函数
  2. 在编辑器中会在用户终止播放模式时调用
  3. 在网页视图关闭时调用

调用时间、次数与作用

满足调用情况时即时调用一次,用于处理一些游戏退出后的逻辑

OnDestory()

调用情况

  1. 场景或游戏结束
  2. 停止播放模式或终止应用程序
  3. 在网页视角关闭时调用
  4. 当前脚本挂载到的游戏物体被删除

调用时间、次数与作用

满足调用情况时即时调用一次,用于一些游戏物体的销毁

创建游戏物体的方式

1.使用构造函数(声明+实例化)创建一个空的游戏对象

GameObject myGo=new GameObject(“NewCreat”)

GameObject();

GameObject(string name);

GameObject(string name,params System.Type[] components);

2.根据现有的预制体(游戏物体)资源来克隆实例化

Public GameObject Gris;

Instantiate(Gris);

3.使用特别的API创建一些基本的游戏物体类型

GameObject.CreatePrimitive(Primitive.Plane);

游戏物体的获取与查找

this指当前脚本组件

this.gameObject 访问当前脚本所挂载到的游戏物体

通过查找获取到它的引用可以访问其他

标签 gameObject.tag

层级(作用物理检测、渲染)gameObject.layer

有引用:

对自己 this.gameObject

对其他游戏物体

Public GameObject cube;

cube.方法/变量;

没有直接引用:

对其他游戏物体

1.通过名称查找

GameObject mainCamerGo=GameObject.Find(“MainCamera”);

2.通过标签查找

GameObject mainCameraGo

=GameObject.FindGameObjectWithTag(“MainCamera”);

3.通过类型查找与获取 FindObjectOfType< >;

4.多数查找与获取

GameObject[] enemyGos

=GameObject.FindGameObjectsWithTag(“Enemy”);

BoxCollider[] colliders=GameObject.FindObjectOfType();

MonoBehaviour(基类)

MonoBehaviour派生自组件脚本,因此组件脚本所有的公有、保护的属性,成员变量方法等功能MonoBehaviour上都有

MonoBehaviour继承自Behaviour,Behaviour继承自Component,Component继承自Object,子辈拥有父辈以及父辈机上(派生程度低的基类)所有的公有、保护的属性,成员变量方法等功能,挂载功能其实是Component,也就是我们写的脚本组件是指Component而MonoBehaviour是在此基础上进行的封装与扩展

获取其他游戏物体身上的组件对象

GameObject cube=GameObject.Find(“cube”);

cube.GetComponent();

GetComponentInChildren 从自身及其子类中返回第一个符合的Component

Transform

场景中每一个对象都有一个变换组件。它用于存储和操作对象的位置、旋转和缩放

Tansform的访问与获取

this.transform

此物体的子物体(指Tansform)的个数:this.tranform.childCount

世界空间中的坐标位置:this.transform.position

以四元数形式表示的旋转(以度数为单位)this.transform.eulerAngles

此物体父级Transform是:this.transform.parent

此物体相对于父物体的坐标位置:this.transform.localPosition

此物体相对于父物体以四元数形式表示的旋转:this.transform.localRotation

此物体相对于父物体以欧拉角形式表示的旋转(以角度为单位):

this.transform.localEulerAngles;

此物体相对于父物体的缩放变换:this.transform.localScale;

自身坐标正前方(z轴正方向):this.transform.forward;

自身坐标正右方(x轴正方向):this.transform.right;

自身坐标正上方(y轴正方向):this.transform.up;

transform.Translate(Vector2.left*moveSpeed,Space.World/Self);

//第一个参数按世界坐标系移动,第二个参数指定世界坐标系—>实际按世界坐标系移动

//第一个参数按自身坐标系移动,第二个参数指定自身坐标系—>实际按世界坐标系移动

//第一个参数按世界坐标系移动,第二个参数指定自身坐标系—>实际按自身坐标系移动

//第一个参数按自身坐标系移动,第二个参数指定世界坐标系—>实际按自身坐标系移动

旋转

transform.Rotate(new Vector3(0,0,1));

transform.Rotate(Vector3 axis,float angle);沿axis轴旋转angle度

查找

当前脚本挂载的游戏对象下的第一个子对象的Transform引用:

transform.GetChild(0);

此物体在父对象里同级所在的索引位置

transform.GetSiblingIndex();

Vector2

[结构体类型变量]

静态变量

y轴正方向Vector2.down  Vector2.up

x轴正方向Vector2.right  Vector2.left

构造函数

Vector2 v2=new Vector(2,2);

成员变量

向量的模长 v2.magnitude

向量的模长的平方 v2.sqrmagnitude

向量单位化 v2.normalized(不改变向量本身值)

公共函数

如果给定向量与该向量完全相等,则返回true

bool equal=v2.Equals(new.Vector2(1,1):

v2.Normalize();单位化

v2.Set(8,8)

静态函数

从va指向vb方向计算的无符号夹角:Vector2.Angle(va,vb):

从va指向vb方向计算的有符号夹角(以度为单位,逆时针为正):

Vector2.SignedAngle(va,vb):

va点与vb点之间的距离:Vector2.Distance(va,vb);

向量va与向量vb的点积:Vector2.Dot(va,vb);

向量va与向量vb在各个方向上的最大分量组成的新向量的点积:

Vector2.Max(va,vb);

Unity常用API方法与类+物体移动、旋转方法+习题_第1张图片

 

向量va与向量vb在各个方向上的最小分量组成的新向量的点积:

Vector2.Min(va,vb);

va向vb按照0.5的比例进行线性插值变化之后的结果:

Vector2.Lerp(va,vb,0.5f);

va向vb按照-1的比例进行(无限制)线性插值变化之后的结果:

Vector2.LerpUnclamped(va,vb,-1);

将点va以最大距离不超过0.5f为移动步频移向vb

Vector2.MoveTowards(va,vb,0.5f);

va和vb在各个方向上的分量相乘得到的新向量

Vector2.Scale(va,vb);

使用Lerp匀速插值的方法

public float percent;

public float lerp

访问输入系统的接口类

连续检测(移动)

当前玩家输入的虚拟轴值

Input.GetAxis(“虚拟轴”);

当前玩家输入的虚拟轴值(未应用平滑过滤)

Input.GetAxisRaw(“虚拟轴”)

当前玩家鼠标水平移动的增量

Input.GetAxis(“Mouse X”);

当前玩家鼠标垂直移动的增量

Input.GetAxis(“Mouse Y”);

连续检测(事件)

if(Input.GetBotton(“虚拟轴”))

KeyCode类里映射到键盘上的物理键

间隔检测(事件)

玩家按下虚拟按钮时返回trure

if(Input.GetButtonDown(“虚拟轴”))

当前玩家按下Q键

if(Input.GetKeyDown(KeyCode.Q))

玩家按下任意一按键

if(Input.anyKeyDown)

鼠标

玩家按住鼠标左键

if(Input.GetMouseBotton(0))

玩家按下鼠标右键

if(Input.GetMouseBottonDown(1))

玩家松开滚轮

if(Input.GetMouseButtonUp(2))

鼠标行为检测的回调事件

挂载Collider碰撞器

private void OnMouseDown()在游戏物体身上按下了鼠标

private void OnMouseUp()在游戏物体身上按下的鼠标抬起了

private void OnMouseDrag()在游戏物体身上用鼠标进行了拖拽操作

private void OnMouseEnter()鼠标移入了游戏物体

private void OnMouseExit()鼠标移出了游戏物体

private void OnMouseOver()鼠标悬停在游戏物体身上

private void OnMouseUpAsButton()鼠标在游戏物体身上松开了

动画

(以标准单位化时间)从当前状态到任何其他状态的淡入淡出效果

animator.CrossFade();

(以秒为单位)进行淡入淡出效果来播放动画

Time

Time.deltaTime完成上一帧所用的时间(以秒为单位0.02s)

Tiem.fixedDeltaTime执行物理或者其他固定帧率更新的间隔时间

Time.fixedTime自游戏启动以来的总时间(以物理或者其他固定帧率更新的时间间隔累计)

Time.time游戏开始以来的总时间

Time.realTimeSinceStarUp游戏开始以来的实际时间

Time.smoothDeltaTime经过平滑处理的Time.deltaTime的时间

Time.timeScale时间流逝的标度,可用来放慢动作

Time.timeSinceLevelLoad自加载上一个场景以来的时间

Mathf

静态变量

Mathf.Deg2Rad度到弧度换算常量

Mathf.Rad2Deg弧度到度换算常量

Mathf.Infinity正无穷大的表示形式

Mathf.NegativeInfinity负无穷大的表示形式

静态函数

Mathf.Abs()绝对值

Mathf.Acos()反余弦(以弧度为单位)

Mathf.Floor(2.74)/Mathf.FloorToInt(2.74)小于或等于2.74的最大整数

Mathf.Lerp(1,2,0.5f) a和b按参数t进行线性插值

Mathf.LerpUnclamped

Random类

静态变量

Random.value随机出[0,1]之间的浮点数

Random.insideUnitCircle在(-1,-1)~(1,1)范围内随机生成的一个Vector2

静态函数

Random.Range(0,4)

在区间[0,4)内产生随机数

(整形重载含左不含右,浮点形重载左右都包含)

伪随机数

Random.InitState(1);

Random.Range(0,4);

设置完随机数状态之后在[0,4]区间内生成的随机数

协程

用途:1.调用时间2.和其他逻辑一起协同执行

(比如一些很耗时的工作,在这个协程中执行异步操作,比如下载文件,加载文件等)

private Animator animator;

IEnumerator ChangeState()

{ //暂停几秒(协程挂起)

yield return new WaitForSeconds(2);

animator.Play(“Walk”);

}

//等待一帧

yield return null;

yield return n;(n为任意数字,一般为0);

//在本帧末执行以下逻辑

yield return new WaitForEndOfFrame();

//开启、停止协程

StartCoroutine(“ChangeState”);

StopCoroutine(“ChangeState”);

IEnumerator ie=ChangeState();

StartCoroutine(ie);

StopCoroutine(ie);

让协程逻辑持续执行的方法

延时调用方法

Invoke(“方法名”,延迟时间)

InvokeRepeating(string methodName,float time,float repeatRate);

在time秒后调用methodName方法名,然后每repateRate秒调用一次

停止使用Invoke延时调用的方法

Cancelnvoke(“方法名”);CanceInvoke();

IsInvoking(“方法名”);IsInvoking();-->只要程序里有Invoke函数在执行,就会返回true

Invoke不能调用带参函数,若想调用带参函数用协程

2D刚体类的成员变量与方法

2D碰撞检测

条件:运动的一方有刚体,双方都有碰撞器

private void OnCollisionEnter2D(Collision2D collision)

private void OnCollisionStay2D(Collision2D collision)//在碰撞器里

private void OnCollisionExit2D(Collision2D collision)

//从碰撞器里移出

2D触发检测

条件:运动的一方有刚体,双方都有碰撞器+有一方有触发器Is Trigger

private void OnTriggerEnter2D(collider2D collider)

private void OnTriggerStay2D(collider2D collider)

private void OnTriggerExit2D(collider2D collider)

Audio Source组件

private AudioSource audioSource;

void Start()

{ audioSource=GetComponent();

audioSource.clip=musicClip;

audioSource.Play();

audioSource.mute=true;

audioSource.Pause();

}

private bool muteState;

void Update()

{ if(Input.GetKeyDown(KeyCode.M)

{muteState=!muteState;

 audioSource.mute=muteState;

}

}音乐并没有静止,只是把音量设为最小了

audioSource.PlayOneShot(Audio clip,float volumeScale[音量大小缩放乘系数]);//播放一次

AudioSource.PlayClipAtPoint(soundClip(播放音频源),播放位置);

自动实例化出One shot audio挂一Audio Source组件

近大远小(距离Audio Listener组件(主相机)的远近)3D环绕音

资源的动态加载

Resources.Load(“资源名”);需创建一个固定文件夹Resourecs,可以加载它下边的资源

对比:public AudioClip sound;//还得拖,且不利于版本的更新

加载游戏物体资源

Instantiate(Resources.Load(@“Prefabs/cube(分目录)”);

或者

Object obj=Resources.Load(“sound”);

AudioClip ac=obj as AudioClip;或AudioClip ac=(AudioClip)obj;

加载当前目录下的所有同类型资源

AudioClip[] audioclip=Resources.LoadAll(“prefabs”);

//有子目录

AudioClip[] audioclip=Resources.LoadAll(“”);

//没有子目录

场景管理using UnityEngine.SceneManagement;

SceneManager.LoadScene(索引);//File—>Build Settings

SceneManager.LoadScene(“场景名字”);

异步加载大场景(可以各走各的)

Scenemanager.LoadSceneAsync(“”);

旋转物体方法

1.transform.rotation/localRotation=Quaternion.Euler(30,30,30);//用四元数,把欧拉角转换为四元数

2.transform.Rotate(new Vector3(0,1,0),1f,Space.World);//new Vector3(0,1,0)旋转围绕的轴,1f每帧旋转角度

或transform.Rotate(new Vector3(0,1f,0));//x,y,z代表每帧旋转的数值

3.transform.eulerAngles=new Vector3(0,30,0);//用欧拉角

4.Quaternion target=Quaternion.Euler(0.180,0);

transform.rotation=Quaternion.Lerp/Slerp(transform.rotation,target,Time.deltaTime);

5.RotateAround(Vector3 point,Vector3 axis,float angle);//让物体绕目标位置旋转(围绕的中心,围绕的轴,每次旋转的角度)

public Transform point;

transform.RotateAround(point.tranform..position,new Vector3(0,,1,0),1f);

6.刚体组件

刚体.angularVelocity以弧度每秒为单位测量的刚体的角速度矢量

public Rigidbody rb;

void FixedUpdate()

{ rb.angularVelocity=new Vector3(0,2,0);}//Vector3(0,2,0)表示一个角速度

移动物体方法

1.transform.position+=new Vector3()

2.transform.Translate(Vector3 transform)//根据transform的方向和距离移动变换

transform.Transform(float x,float y,float z);//将变换沿x轴移动|x|,y轴移动|y|,z轴移动|z|

3.Vector3.MoveTowards(Vector3 current,Vector3 target,flaot maxDistance)//匀速朝目标移动

4.Vector3.Lerp/Slerp(Vector3 a, Vector3 b,float t);

5.Vector3.SmoothDamp平滑阻尼//随时间推移将一个向量逐渐改变为所需目标

Vector3.SmoothDamp(Vector3 current,Vector3 target,ref Vector3 currentVelocity,float smoothTime,float maxSpeed);

6.Rigidbody.AddForce(Vector3 force,ForceMode mode=ForceMode.Force);

  Rigidbody.MovePosition(Vector3 position);

习题:

1.unity引擎不支持的视频文件格式:swf

2.HDR高动态光照渲染属于哪个属性:Camera组件

3.对Mesh Renderer组件描述正确的是:

Mesh Renderer组件从Mesh Filter组件中获取网格信息,并根据物体的Transform组件所定义的位置进行渲染

4.当一个物体在视野内被其他物体遮罩,不希望对该物体进行渲染:Qcclusion Culling

5.制作Skybox时,为了避免出现纹理拼接时产生的接缝,这些纹理的循环方式应该设置为哪一项:Clamp

6.一下哪个视图主要用于显示和编辑所选游戏对象或资源的相关属性:Inspector

7.在场景中需要使一个带有网格的GameObject接受来自Light Probes的环境光照,需要对哪个组件的Use Light Probes属性进行设置:Mesh Renderer

8.Normal map类型的纹理能够在渲染时为三维模型的表面增加凹凸细节

9.可以用于打开设置发布程序选项的面板:Edit—>Project Settings—>Player

10.unity使用的是左手坐标系

11.对摄像机Rendening Path的设置中,Deferred Lighting可以使Spot Light对物体光照的阴影以实时的方式渲染

12.以下哪组摄像机中Normalized View Poit Rect的设置可以使摄像机显示的画面位于1280*720分辨率的屏幕画面右上角

A.x=640 Y=-360 W=640 H=360

B.x=640 Y=0    W=640 H=360

C.x=0.5 Y=0    W=0.5 H=0.5

D.x=0.5 Y=-0.5 W=0.5 H=0.5

13.以下关于www.LoadFromCacheOrDownLoad描述正确的是:

        可被用于将Asset Bundles自动缓存到本地磁盘

14.为了正确使用Unity提供的Light mapping功能,不必要的措施是

A.将所有参与烘焙的物体设置为Light map Static

B.将场景中的所有相机设置为Light mapping Enabled

C.确保所有参与烘焙物体的Light map UVs在[0,1]之间

D.确保所有参与烘焙灯光的Light mapping Mode为“Baked Only”或“Auto”

15.以下哪个方式不能够提高在Unity中烘焙Light maps的质量

A.增加Resolution值

B.增加Bounces值

C.增加Final Gather Rays值

D.增加Contrast Thresh old值

16.Mecanim动画系统支持导入Animation类型不包括:

A.Humanoid B.Auto C.Generic D.Legacy

17.哪种不属于Unity所定义的Rendering Path

A.Forward Rendering

B.Vertex Lit

C.Pixel Lit

D.Deferred Lighting

你可能感兴趣的:(UNITY基础,unity,游戏引擎)