了解帧的概念

游戏的本质就是一个死循环
每一次循环都会处理游戏逻辑并更新一次游戏画面
之所以能看到画面在动 是因为
切换画面速度达到一定速度时
人眼就会认为画面是动态且流畅的
一帧就是执行了一次循环
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
12
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);

3.利用流StreamWriter和StreamReader执行读写操作
StreamReader类的方法:
Read():读取流中的下一个字符。
ReadBlock():读取一个字符块。
ReadLine():从流中读取一行字符
ReadToEnd():从流的当前位置读取到流的末尾
Close():关闭当前流,并释放资源
StreamWriter类的方法:
Write():写入数据
WriteLine():写入数据,并添加行结束符
Close():关闭当前流,并释放资源

参考代码:CsvManager.cs

1
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
35
using 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