Unity2D 学习笔记 0.Unity需要记住的常用知识
前言
从小是一个很喜欢玩游戏的人,大概四岁的时候,在父亲的帮助下,接触了红色警戒,后来又在同一栋楼的好朋友的推荐下,了解到了星际争霸和魔兽争霸。从那时候开始就总想做出一款有着类似星际争霸那样的剧情宏大,玩法新颖的游戏,希望自己能够坚持下去吧。
之后所有的学习笔记都是基于自己一个练手的项目,下面介绍我用的Unity版本,供大家借鉴:
Unity版本:2023.1.12f1c1
使用的VS版本2022
这一章主要是记录一些奇怪的设置,以及一些预设函数名称和用法。将来也会不断补充。
调整Project Setting
Tilemap相关(创建地图块)
C#脚本函数介绍
程序运行函数
private void Awake()
在加载脚本实例时会调用此函数。
此函数的调用比Start更早。
void Start()
在程序开始正式运行之前,调用的用于初始化程序的函数。
注意:仅在首次调用Update函数之前会执行此函数。
void Update()
在每一帧都会运行一次该函数,作为程序的主函数,十分重要。
Collider2D碰撞检测
private void OnTriggerStay2D(Collider2D player)
用于检测是否有物体与该Collider包围盒有接触。只要有物体待在检测框内,便会一直出现结果。具体运行逻辑为:每帧运行一次这个函数,检测相关碰撞。
注意: 这个检测会因为物体进入睡眠状态而停止,如何改变睡眠状态见后文Debug部分。
private void OnTriggerEnter2D(Collider2D player)
用于检测物体是否进入检测框,只会在进入的瞬间运行。
如何确定碰撞物体的性质
- 利用碰撞物体的tag进行标识,如上图。
关键词
this
用于代指该脚本类,这与C++中相关概念类似。
gameObject
代指该脚本所挂在的gameObject。
void GameObject.SetActive(bool value)
用于设置该对象能否使用,是否激活。
T GameObject.GetComponent<T>()
用于获取该对象的某个组件。
Transform(Panel)
可以用于表示Panel。真是cao了!!害的我还写了一个Panel管理脚本。
Time
Time.deltaTime
用于返回当前游戏每一帧的时间,例如假如该游戏60帧,则
T
i
m
e
.
d
e
l
t
a
T
i
m
e
=
1
60
Time.deltaTime=\frac{1}{60}
Time.deltaTime=601
Mathf
一个数学相关的库文件,可以直接引用,不需要Include和Using
Mathf.Clamp(value, min, max)
将value规范化到[min, max]区间内:
v
ˉ
=
m
i
n
(
m
a
x
(
v
,
m
i
n
)
,
m
a
x
)
\bar{v} = min(max(v, min), max)
vˉ=min(max(v,min),max)
输入检测Input
键盘输入相关
Input.GetKeyDown(KeyCode key)
用于获取键盘输入,其家族函数为Input.GetKey()、Input.GetKeyUp(),用于检测键盘按键的输入,这里的KeyCode可以通过KeyCode.X调用,其中X可以代表所有可选择的。
Input.GetAxis(string name)
用于获取在name方向上的输入,例如有"Horizontal"(水平),“Vertical”(垂直)。具体设置可以在Project Settings>Input Manager里面修改。
bool Input.GetButtonDown(string ButName)
获取目标按钮的按下状态,如果按下 则返回true。
Unity Component相关
Trick
static的应用
1.可以在类开头声明一个本身类型的static变量用于指向自身,从而使这个脚本控件能在全局任何调用该类的地方访问。
class Temp(){ static Temp instance = this; }
如何保证UI对于屏幕位置不随屏幕尺寸改变
改变这个东西
在这个里面选择布局。
UI
Panel
这个类在C#中并没有对应的类,可是如果想要控制Panel,以及其子结构中的Component怎么办呢?
这里提供两种思路:
1.写一个脚本,添加到每个Panel中,之后查询这个脚本类。
2.利用Transform类,可以表示Panel。
Text 和TextMeshProUGUI
这里我认为算是Unity非常奇怪的地方,如果只为了写文本,则两者理论上应该是一样的,然而在调用过程中则非常不同。我认为这可能是Unity版本的问题,TextMeshProUGUI作为高版本引入的含有更多功能的类,实际上确实比Text更丰富,然而其API缺不相同,且两者并不能互通,即你搜Text类是无法搜到TextMeshProUGUI类的,这十分麻烦。
下面是Text类。
总之在搜索的时候需要注意。
Debug和奇怪问题
1.Q:为什么在碰撞检测脚本中,使用OnTriggerStay2D函数时,物体进入并Stay后,该函数只会响应一会,随后便不响应了?
A:这是因为这个物体在Stay过程中,会自动休眠。如果想要改变这个现状,可以修改Edit>Project Settings>Physics 2D>Time To Sleep这个值,或改变其下面两个参数,来控制休眠时间。
2. 为什么我在UnityEngine.UI中使用了Image控件,然而在VS中写C#脚本时,Public Image 却无法正常识别?
因为Unity不会默认每个程序都使用UI控件。想要改变这一状况,需要在开头添加Using UnityEngine.UI。即可。