kizumi_header_banner_img

Hello! Beautiful Kizumi!

加载中

文章导读

Unity入门


avatar
Yuyas 2025年12月19日 14

脚本基本规则

继承MonoBehavior的类不要写构造函数(构造器),因为不能被new只能挂载,不会通过构造函数实例化对象,所以没有写构造函数的意义,写了会在结构上破坏Unity设计上的规范

继承MonoBehavior的类不能new只能挂载在GameObject上,这是Unity的规则

生命周期函数

Awake:出生时调用(加载新场景),类似构造函数,一个对象只会调用一次

OnEnable:对象激活时调用,手动激活为物体Inspector窗口最上方的勾

Start:创建对象后,第一次帧更新前调用,时间比Awake晚一点

FixUpdate:物理帧更新,间隔时间可以设置

Update:逻辑帧更新

LateUpdate:每帧执行,与Update后执行

OnDIsable:对象失活时调用,与OnEnable对应

OnDestory:对象被销毁时调用

生命周期函数

实际上这些生命周期函数并不是MonoBehavior的成员,所以Unity是通过反射来自动执行这些函数的

Unity中所有对象上挂载的生命周期函数都是在一个主线程中按先后执行的

Mono重要内容

重要成员(this可以省略):

this.object,获取依附的GameObject

this.transform,获取依附的GameObject位置信息,也可以写成this.object.transform(一般不会这么写)

this.enabled,获取脚本是否激活,手动激活/失活 this.enabled = true/false ;

重要方法:

My_script sc = this.GetComponent(typeof(My_script)) as My_script; // 得到对应单个脚本

My_script sc = this.GetComponent <My_script>(); // 二者效果一致

My_script[] sc = this.GetComponents <My_object>(); // 得到多个脚本,括号内也可传入list,直接将内容存进list

My_script sc = this.GetComponentInChildren<Children_script>(); // 获取子对象脚本,默认也会查询自己身上是否挂载该名脚本,括号内可以传true表示是否寻找失活子对象,也可以GetComponentsInChildren获取多个

My_script sc = this.GetComponentInParent<Children_script>(); // 获取父对象脚本,同上

GameObject:

成员变量:

name,transform,activeSelf(是否激活),isStatic(是否静态),layer(层级),tag(标签)

静态方法:

GameObject.CreatPrimitive(PrimitiveType.Cube); // 创建一个物体,返回Object可被接收

GameObject.Find(“xxx”); // 返回名为xxx的Object对象,效率较低,无法找到失活对象,有多个时无法确定

GameObject.FindWithTag(“xxx”);

GameObject.FindGameObjectWithTag(“xxx”); // 同上

GameObject.FindGameObjectsWithTag(“xxx”); // 返回多个对象

GameObject.FindObjectOfType(“My_script”) // 查找挂载对应脚本的对象,效率更低

以上方法使用频率很低,通常是使用效率高的直接挂载的办法来查找对象,下面方法较为重要

GameObject.Instantiate(“My_obj”) // 实例化(克隆)对象,动态创建,往往是预制体,此处的GameObject可省,因为此方法为Unity中Object基类提供的方法

GameObject.Destory(“My_obj”) // 删除对象,也可以删除脚本,会在下一帧才移除,可选第二参数int,表示延迟几秒删除。

GameObject.DestoryImmediate(“My_obj”) // 立即删除,不用等到下一帧,前者为异步,会减少卡顿

默认在切换场景时,原本的对象都会被移除

GameObject.DontDestoryLoad(“My_obj”) // 调用此方法则不会在切换场景时被移除

成员方法:

GameObject obj = new GameObject(“ObjName”,typeof(脚本1),type(脚本2)………) // 创建新物体

obj.AddComponent<脚本名> ();// 给对象添加脚本

this.gameObject // 脚本的成员方

this.CompareTag(“TagName”) // 返回bool,检查是否为该tag

this.gameObject.Compare(“TagName”) // 与前者相同,只不过前者调用的是Mono中的方法,而此为GameObject中的方法

obj.SetActive(false) // 设置对象激活/失活

以下方法效率低,强烈不建议使用,仅作为了解

obj.SendMessage(“My_function”) // 从挂载的所有脚本中找到对应的方法去执行

obj.BroadcastMessage(“My_function”) // 自己及其子对象执行

obj.SendMessageUpwards(“My_function”) // 自己及其父对象执行

Time:

时间缩放比例(时间流速)

Time.timeScale = 1;

帧间隔时间

Time.deltaTime // 受scale影响,数值为(unscale返回值 * scale)

Time.unscaleDeltaTime // 不受scale影响

游戏开始到现在的时间

Time.time

TIme.unscaleTime

物理帧间隔时间

Time.fixedDeltaTime

Time.fixedUnscaledDeltaTime

游戏开始到现在跑了多少帧

Time.frameCount

Transform:

位置

transform.position // 世界坐标系

transform.localPosition // 本地坐标系

this.transform.forward // 物体自身坐标系的前方

transform.forward // 世界坐标系的前方(z = 1)

position的xyz坐标值只可读不可直接去修改,只能通过Vector3来进行操作

position的返回值是Vector3

进行位移的话除了手动实现,Unity还自带有api

transform.Translate(Vector3,Space.Self/World)

旋转

transform.eulerAngles;

transform.localEulerAngles;

与position一样不能直接更改,要用Vector3操作

自转API(前者为自身,后者为指定点)

transform.Rotate(Vector3.up,10 * Time.deltaTime,Space.Self/World) // 参数依次为 所绕旋转的轴 速度 相对系

transform.RotateAround(所绕点的坐标,轴,速度)

缩放大小

transform. lossyScale // 相对于世界的缩放,只读,可能有精度损失,因此叫lossy

transform.localScale = Vector3 // 相对于父亲的缩放

看向

transform.LookAt(Vector3)

父子关系

获取和设置父对象

this.transform.parent

this.transform.patent = null // 断绝父子关系

this.transform.patent = GameObject.transform // 设置父子关系

通过API设置父子关系

this.transform.SetParent(null)

this.transform.SetParent(GameObject.transform) // 与直接设置不同的是,可以传入第二个bool参数,默认为true即视觉位置不变transform改变,false即不改变自身的transform信息

和自己的所有儿子断绝关系

this.transform.DetachChildren()

寻找儿子(不能找孙子)

this.transform.Find(”儿子名字”) // 与GameObject的Find不同的是,该方法可以找到失活的对象

儿子数量(不算孙子)

this.transform.childCount // 失活的儿子也算

通过索引找儿子

this.transform.GetChild(index)// 0开始

判断父亲是否是某个对象

son.IsChildOf(transform)

得到儿子编号

son.GetSiblingIndex();

设置为第一个儿子

son.SetAsFirstSibling();

设置为最后一个儿子

son.SetAsLastSibling();

设置为指定位置的儿子

son.SetSiblingIndex(index); // 超出最大值的话会直接设置为最大的编号,超出最小值同理

坐标转换

世界坐标转化为本地坐标(判断相对位置)

this.transform.InverseTransformPoint(Vector3); // 受缩放影响

世界坐标方向转化为本地坐标方向

this.transform.InversTransformFromDirecrtion(Vector3) // 不受缩放影响

this.transform.InversTransformFromVector(Vector3) // 受到缩放影响

下面反过来转化,API名称去掉Invers(相反的)

本地坐标转化为世界坐标

this.transform.Transformpoint(Vector3) // 受到缩放影响

本地坐标方向转化为世界坐标方向

this.transform.TransformFromDirecrtion(Vector3) // 不受缩放影响

this.transform.TransformFromVector(Vector3) // 受到缩放影响

Input鼠标键盘输入

鼠标位置,原点为左下角

Input.mousePosition // 返回Vector3,z=0

检测鼠标(null,up,down)

Input.GetMouseButton(num) // 0 左 1 右 2 中,无论Up还是Down都会触发

检测键盘(null,up,down)

Input.GetKey(KeyCode.K)

Input.GetKey(”k”)// 两种等价,后者必须小写

检测默认轴输入

Input.GetAxis (”Horizontal”) // AD左右

Input.GetAxis (”Vertical”) // WS前后

Input.GetAxis (”Mouse X”)// 鼠标左右

Input.GetAxis (”Mouse Y”) // 鼠标前后

GetAxisRaw与GetAxis区别在于返回值非平滑过渡

其他

检测任意按键

Input.anyKey

某一帧的键盘输入

Input.inputString

手柄相关……….略

屏幕相关Screen

常用:

分辨率

Resolution r = Screen.currentResolution

r.width r.height // 屏幕分辨率宽高

Screen.width/height // 游戏窗口宽高

屏幕休眠

Screen.sleepTimeout = SleepTimeout.NeverSleep // SystemSetting

不常用:

Screen.fullScreen = true;

Screen.fullScreenMode

移动设备屏幕旋转相关…….略

API:

Screen.SetResolution(int Width,int Height,bool IsScreenFull) // 设置分辨率,移动设备不需要

摄像机相关

可编辑参数:

摄像机参数说明

摄像机参数说明2

快速获取主摄像机

Camera.main

Camera.allCamerasCount

Camara.allCameras

世界坐标转屏幕坐标

Camera.main.WorldToScreenPoint(this.transform.position)

屏幕坐标转世界坐标

Vector3 v = Input.mousePosition;

v.z = 10;

Camera.main.WorldToScreenPoint(v)\

光源

光源参数说明1

光源参数说明2

刚体

刚体参数1

刚体参数2

刚体参数3

物理材质可以决定物体的摩擦力,弹力

碰撞相关函数:

特殊的生命周期函数

有物理阻挡,碰撞器:

private void OnCollisionEnter(Collision collision){ }

private void OnCollisionExit(Collision collision){ }

private void OnCollisionStay(Collision collision){ }

用collision.gameObject来获取碰撞对象

没有物理阻挡,:

private void OnTriggerEnter(Collider other){ }

private void OnTriggerExit(Collider other){ }

private void OnTriggerStay(Collider other){ }

施加力

rigidBody.AddForce(Vector3);

rigidBody.AddRelativeForce(Vector3); // 相对与本地坐标

存在第二参数ForceMode

扭矩力

rigidBody.AddTorque(Vector3)

rigidBody.AddRelativeTorque(Vector3)

直接改变速度

rigidBody.velocity = Vector3

爆炸力

rigidBody.AddExplosionForce(float 爆炸力,Vector3 爆炸坐标,float 爆炸半径)

刚体的休眠

if(rigidBody.IsSleeping()) rigidBody.WakeUp();

音频

audioSource.Play()/Stop()/Pause();

PlayDelayed(int);

audioSource.isPlaying;

动态播放不同音效,一个GameObject挂载多个AudioClip

public AudioClip clip;

audioSouce.audioClip = clip;

麦克风

Microphone.Start(设备默认null,是否循环录制false,录制时长,采样率44100) // 返回AudioClip



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码

个人信息

avatar

24
文章
1
评论
1
用户

近期文章