Unity学习
了解帧的概念
游戏的本质就是一个死循环
每一次循环都会处理游戏逻辑并更新一次游戏画面
之所以能看到画面在动 是因为
切换画面速度达到一定速度时
人眼就会认为画面是动态且流畅的
一帧就是执行了一次循环
Unity底层已经封装好了这个死循环
我们只需要利用Unity的生命周期函数的规则来执行游戏逻辑即可
FPS(Frames Per Second)
即每秒钟帧数
一般我们说60帧30帧
意思是1秒更新60次、30次画面
1s = 1000ms
60帧:1帧为 1000ms/60 ≈ 16.66ms
30帧:1帧为 1000ms/30 ≈ 33.33ms
游戏卡顿的原因:
跑1帧游戏逻辑的计算量过大,或者硬件性能过低,无法在一帧的时间内处理完所有游戏逻辑
生命周期函数的概念
所有继承MonoBehavior的脚本 最终都会挂载到GameObject游戏对象上
生命周期函数就是该脚本对象依附的GameObject对象从出生到消亡整个生命周期中
会通过反射自动调用的一些特殊函数
Unity帮助我们记录了一个GameObject对象依附了哪些脚本
会自动地得到这些对象,通过反射去执行一些固定名字的函数(就是生命周期函数)
生命周期函数
注意:
生命周期函数的访问修饰符一般为private和protected
因为不需要在外部手动调用生命周期函数,都是Unity自动帮我们调用
预制体:
将scene中的物体拖入assets中以制作一个预制体,将assets中的预制体拖入scene中以调用预制体实例。修改预制体实例不会影响原始预制体,修改原始预制体会影响所有预制体实例。
句柄:
“句柄(Handle)是一个用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量。Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。
Unity创建APK:
Edit->Preferences->External tools中JDK、SDK、NDK均安装完成且配置好路径
如果没有安装到Unity Hub->安装->对应版本的设置->添加模块->Android Build Support里去下
装载apk:
File->Build Settings->Android->Build即可
Unity数据持久化
1.引入System.IO
2.分平台创建存储表1
2
3
4
5
6
7
8
9
10
11
12if (Application.platform == RuntimePlatform.Android) //安卓平台
{
FilePath = Application.persistentDataPath+ FileName+".csv";
}
else
{
FilePath = Application.streamingAssetsPath+"/"+FileName+".csv";
if(!Directory.Exists(Application.streamingAssetsPath))
Directory.CreateDirectory(Application.streamingAssetsPath);
}
if(!File.Exists(FilePath))
File.Create(FilePath);
3.利用流StreamWriter和StreamReader执行读写操作
StreamReader类的方法:
Read():读取流中的下一个字符。
ReadBlock():读取一个字符块。
ReadLine():从流中读取一行字符
ReadToEnd():从流的当前位置读取到流的末尾
Close():关闭当前流,并释放资源
StreamWriter类的方法:
Write():写入数据
WriteLine():写入数据,并添加行结束符
Close():关闭当前流,并释放资源
参考代码:CsvManager.cs1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35using System.IO;
public class CsvManager:MonoBehaviour
{
void Awake()
{
string FilePath; //确定路径
if (Application.platform == RuntimePlatform.Android) //安卓平台
FilePath = Application.persistentDataPath+ FileName+".csv";
else
{
FilePath = Application.streamingAssetsPath+"/"+FileName+".csv";
if(!Directory.Exists(Application.streamingAssetsPath))
Directory.CreateDirectory(Application.streamingAssetsPath);
}
if(!File.Exists(FilePath)) //创建存储表
File.Create(FilePath);
SaveBtn.onClick.AddListener(() => //保存
{
StreamWriter sw=new StreamWriter(FilePath);
sw.WriteLine(Trot.Trot_x0);
sw.WriteLine(Trot.Trot_y0);
sw.Flush();
Log("SaveData");
sw.Close();
});
LoadBtn.onClick.AddListener(() => //加载
{
StreamReader sr=new StreamReader(FilePath);
Trot.Trot_x0=Convert.ToSingle(sr.ReadLine());
Trot.Trot_y0=Convert.ToSingle(sr.ReadLine());
Log("LoadData");
sr.Close();
});
}
}
参考文章:
.csv格式持久化
https://blog.csdn.net/qq_39708228/article/details/125895012
https://www.bilibili.com/video/av941240355/?vd_source=4f21648bd11611b182cf4f36108a894d
安卓端数据持久化
https://blog.csdn.net/weixin_46472622/article/details/129583483
https://blog.csdn.net/qq_42345116/article/details/123034327
Unity拖拽
https://www.bilibili.com/video/BV1W541147GK
Unity线渲染器
LineRenderer的本质:
连点成线
不太适合UI制作
挂载在某物体下,零坐标为该物体的坐标,scale=(1,1,1)
链表的文档:
https://blog.csdn.net/weixin_40786497/article/details/104155992
List的文档:
https://blog.csdn.net/qq_42672770/article/details/107494677
RectTransform文档:
https://docs.unity.cn/cn/current/ScriptReference/RectTransform.html
LineRenderer文档:
https://docs.unity.cn/cn/current/ScriptReference/LineRenderer.html