Misaka-xxw的博客

昨日种种,皆成今我

写在前面:
我的第一次游戏开发。这里是当年的记录,都是新手踩坑,确实没有什么技术含量。尽可能地保留原汁原味😂。

游戏名:九章绮梦
unity引擎版本:2022.3.23f1
注意:润色部分要在保证程序编完的情况下,再润色。
Unity调用命令行,另开新的一篇写。

程序开发备忘录

开始任务

  1. 导入图片(重要)
    像素素材,为了防止像素模糊,一定要勾选这两项:
    Filter Mode: Point(No filter)
    Compression: None
  2. 润色:第一章还没有做速度控制器。主速度变量在PlayerController。要更改MoveLandscape和SceneScroller已完成
  3. 重要:主摄像头,要固定下来,现在比例不对!据说要用GUI什么的。
  4. 场景滚动,是用我建立的滚动材料Scroller.mat,再加上滚动脚本即可。注意图片素材模式要是multiple,不能是simple。
  5. panel(暂停后的UI)还没做。先写逻辑,这里估计要放点儿知识文字。
  6. 美术缺很多素材!
  7. 音频准备了一点点,最后可能还要收集,去找免版权的,我买了一点。
  8. 润色:加一个跑步公里数。古代单位估计得。
  9. 重要:游戏玩法设计、存档系统。使用json还是……还有一个剧情系统。剧情估计要用json存,但是在脚本存也可以吧。
  10. 捡到金币的音频已经找到了,还没绑定。还有跳跃的音频还没找到合适的。
  11. 说明:tree绑定了随风摇动的shader。
  12. 说明:看剧本,想一下如何融入数学元素。
  13. 润色:live2D系统,chatGLM调用。
  14. 未修正:角色和场景速度不对2023/4/6已写速度

2024/4/6

  1. 学到了oop里的“单例”用法。虽然还没用。

2024/4/11

L要做的部分

  1. 看懂已经写的ButtonPause.cs,MoveLandscape.cs,PlayerController.cs,RandomObject.cs,SpeedController.cs,SceneScroller.cs,TextCoin.cs仿照FangTianScence.unity,做后面的场景:SuMi粟米,Junshu均输,GouGu勾股。其中勾股部分是用屋顶素材拼的,和其它关不一样,经常跳跃。在PlayerController.cs中仿照金币写一个被敌人碰扣血的函数。后面可能要做一个主人公发起攻击的。
  2. 看上面的记录内容。
  3. 收集物品的脚本。
  4. 做一个存档脚本,存下关卡通关情况,每一关的最高纪录、人物金币收集情况、人物“知识点”。
  5. 准备做UI。网上能找到代码怎么写。

    未来一周规划

程序
  1. 把剧情写进脚本,不用json了,直接用list数据结构包一个class。一个一个读取。然而为了美好的未来,我还是用了json()
美术
  1. 画几张聊天背景图,好,就拍照再加滤镜!
  2. 主页图,经费充足的话用live2d吗?
  3. 地图,这个重要捏
  4. 商店
  5. 像素风:第一关要收集的四个物品,第二关收集的米袋,第四关飞镖。一个暂停界面,只需要个框!最好和按钮一个色卡

    unity live2d使用笔记

    建模过程踩的坑不用提了,因为我忘记记录了
    目线跟踪、眨眼、动画播放要挂载的脚本
    图片
    其中脸部参数可以再调大一点
    图片
    图片
    图片
    这个系列:Unity制作Live2D(三)头部眼睛跟随鼠标
    总之要把动画全部k帧k出来再导入。

    2024/4/12

    关于JSON

    感觉难用,但是就这样吧。
    在老C那儿查到这些避雷的地方:
  6. 用于接收的JSON实体类需要声明[Serializable] 序列化。
  7. 使用Unity自带方法时,实体类如果是属性成员(public bool has_more{get;set;})的话,在序列化的时候会缺失这些成员,导致解析不出来。将属性改为字段即可。
  8. 如果解析的对象是数组,自带的不能成功解析,可以人为将其封装为JSON对象。 对!数组xx的不能不能解析!(愤怒)根本改不好!!!
    但是改着改着它就从这样图片变成了这样图片
    我不理解,完全忘记自己改了什么,并且大受震撼。。。unity我的祖宗,你编译快一点儿
    所以这个有什么用来着?
    1
    {get;set;}
    2024/4/15补充:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    某个人工智能“主动”跟我说:
    In C#, the { get; set; } syntax is used to define a property. Let’s break it down:
    get: This part defines the getter for the property. It allows you to retrieve the value of the property. When you access the property, the code inside the get block is executed, and the result is returned.
    set: This part defines the setter for the property. It allows you to assign a value to the property. When you assign a value to the property, the code inside the set block is executed, and the value is stored.
    Here’s an example of how you might use this syntax to create a simple property in C#:
    ;
    public class Person
    {
    // Private field to store the value
    private string _name;

    // Property with getter and setter
    public string Name
    {
    get { return _name; }
    set { _name = value; }
    }
    }
    In this example:

    The Name property has both a getter and a setter.
    When you read person.Name, it calls the get block and returns the stored _name value.
    When you assign a value to person.Name, it calls the set block and updates the _name field.
    Feel free to adapt this pattern to your specific use case! 😊
    于是莫名其妙的,我们就可以SetTrigger播放人物动画了,好耶!
    顺便一提,不知道哪儿冲突了,小九的微笑眯眯眼和什么冲突了,悲()
    假如此时,能来个很厉害的美工就太美妙了,再来亿点儿live2D模型吧!!

    2024/4/14

    做了剧本一个字一个字播放

    关于c#的oop

    我忘记我要记什么oop了。。。

    2024/4/15

  9. 摄像头比例是Camera.main.aspect。但我还是搞不好啊!
  10. 重新测试了python chatglm角色ai聊天,写了unity和python通信的脚本。
    为什么要用cmd.exe呢?因为太菜了,看到socket的代码望而生畏,觉得cmd比较好搞,遂学之。python那边就是用我们的老朋友sys了。
    这里是用Thread类,网上说不用的话会报错。查了一下概念:
    线程(Thread)是进程中一个单一的顺序控制流程。线程是进程中的实体。一个进程可以有多个线程,一个线程必须有一个父进程。

    2024/4/19

    这几天都在画画。但这是程序开发备忘录。

    2024/4/20

  11. video的导入遇到了困难。还好格式转换解决了。(后面补充一下,还是不行,有bug)
  12. 添加了游戏知识卡,虽然丑丑的。
  13. 比例还是有问题。
  14. 找了画手朋友画了些东西。

    2024/4/忘了

    记得时间戳暂停了恢复回来啊喂!还有ai板块编译出来就寄了,以后要想办法解决!

程序心得记录

累死了,最后一天疯狂修bug,不写啦

记录一次收拾“把超大库放进仓库”的烂摊子

起因

git是放代码的地方,但是我很蠢地把Unity的库给放进去,而且每次提交把全部有用没用的更改全交了。这就是不好好看新手教程的下场啊。
首先,要是直接在github里删除的话,历史记录还在那儿,.git文件依然会特别大。
删了一个library文件夹,.git文件大小: 1.71GB -> 633 MB 。而library自己有多大呢?2.04 GB。。。
于是搜查资料,查到了,按教程做,结果————

1
2
3
4
5
6
7
8
9
10
 git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch Library' --prune-empty --tag-name-filter cat -- --all
WARNING: git-filter-branch has a glut of gotchas generating mangled history
rewrites. Hit Ctrl-C before proceeding to abort, then use an
alternative filtering tool such as 'git filter-repo'
(https://github.com/newren/git-filter-repo/) instead. See the
filter-branch manual page for more details; to squelch this warning,
set FILTER_BRANCH_SQUELCH_WARNING=1.
Proceeding with filter-branch...

Cannot rewrite branches: You have unstaged changes.

嗯。。。但是我没保存的那些没用的东西,真是又多又没用。

解决方式

那就按这他给的链接搜索了。

在保证什么什么环境变量没问题的情况下。

1
pip install git-filter-repo

接下来,cd或者进入到文件夹,右键git bash。
这里教程也写了备份,但是我胆子大,没备份。不能这样。

1
cp -r your_repo your_repo_backup

然后就可以愉快地删除了。

1
git filter-repo --force --invert-paths --path 'Library'

清理并优化本地仓库

1
2
git reflog expire --all --expire-unreachable=now --update-reflogs
git gc --prune=now --aggressive

推送更改到远程仓库

1
2
3
4
5
6
git remote add origin <仓库URL>
或者
git remote set-url origin <仓库URL>

git push origin --force --all
git push origin --force --tags

重新clone,好好设置gitignore啊喂!终于理解去年为什么学长禁止我把美术资源的工程文件也push上了,唉。。。

于是去copy了学长的gitignore文件,以后就不会这么逆天了。仅针对unity引擎。

Unity gitignore模板
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# This .gitignore file should be placed at the root of your Unity project directory
#
# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
#
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/[Ll]ogs/
/[Uu]ser[Ss]ettings/

# MemoryCaptures can get excessive in size.
# They also could contain extremely sensitive data
/[Mm]emoryCaptures/

# Recordings can get excessive in size
/[Rr]ecordings/

# Uncomment this line if you wish to ignore the asset store tools plugin
# /[Aa]ssets/AssetStoreTools*

# Autogenerated Jetbrains Rider plugin
/[Aa]ssets/Plugins/Editor/JetBrains*

# Visual Studio cache directory
.vs/

# Gradle cache directory
.gradle/

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.mdb
*.opendb
*.VC.db

# Unity3D generated meta files
*.pidb.meta
*.pdb.meta
*.mdb.meta

# Unity3D generated file on crash reports
sysinfo.txt

# Builds
*.apk
*.aab
*.unitypackage
*.app
# Crashlytics generated file
crashlytics-build.properties

# Packed Addressables
/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*

# Temporary auto-generated Android Assets
/[Aa]ssets/[Ss]treamingAssets/aa.meta
/[Aa]ssets/[Ss]treamingAssets/aa/*

小剧场

大佬:不过这 直接把library放进去了有点离谱
小w:草率了QAQ
大佬:其实有一个比较稳妥的办法,就是新创一个分支,没问题了再合并。这样做还可以减少多余的commit,就是比较麻烦。
小w:我多余的commit估计有几千个文件改动。。。毕竟那可是把library装进去了
大佬:哈哈

参考链接:

github上的安装说明
csdn的一篇博客
知乎教怎么用gitignore的

面向对象

1
super()._init__()

super()用来调用父类(基类)的方法,init()是类的构造方法, super().init() 就是调用父类的init方法, 同样可以使用super()去调用父类的其他方法。

pyqt6

命令行

  1. 编译
    1
    Pyinstaller -F -w -i cat.ico main.py
  2. ui文件转换成py文件
    先进入相应文件夹,然后打开cmd,输入
    1
    python -m PyQt6.uic.pyuic window.ui -o window.py

sqlite3

直接将字符串插入到SQL语句中,这可能会导致SQL注入的问题。SQL注入是一种攻击,攻击者可以通过在输入字段中插入恶意的SQL代码来操纵数据库。
在代码中,如果传入的数据包含SQL语句,那么这些语句将会被执行,这可能会导致数据库中的数据被修改或者删除。
为了防止这种情况,应该使用参数化查询。

错误代码:

1
self.cur.execute(f'INSERT INTO {self.name} (id, English, Chinese, Phonetic) VALUES(NULL, {English}, {Chinese}, {Phonetic})')

正确代码:

1
self.cur.execute(f'INSERT INTO {self.name} (id, English, Chinese, Phonetic) VALUES(NULL, ?, ?, ?)', (English, Chinese, Phonetic))

英语单词小程序——项目实现任务

做成能用的半成品也不背单词

一. 数据库

(1). 单词

1). 增

  • [x] 增加一个单词
  • [ ] 并且注意英语不重复
  • [ ] 根据excel表格,往单词本增加一堆单词
  • [ ] 根据相同或不同的数据库,别的单词本合并进选定的单词本

2). 删

  • [x] 在单词概览中删除一个单词,并更新
  • [ ] 在单词卡片中删除一个单词,并更新

3). 改

  • [ ] 在单词概览中点击,进入单词卡片模式,再点击可修改和保存
  • [ ] 在默写三模式中,根据对错情况修改权值

4). 查

  • [ ] 本地查询中英文
  • [ ] 联网查询中英文
  • [x] 查询全部单词

(2). 单词本

1). 增

  • [x] 新建一个单词本
  • [ ] 并且注意单词本名不重复
  • [ ] 根据excel表格,新建一个单词本
  • [ ] 根据相同或不同的数据库,新建一个单词本

2). 删

  • [x] 删除一个单词本

3). 改

  • [ ] 修改单词本名

4). 查

  • [x] 查询所有单词本名字
  • [ ] 查询单词本单词总数
  • [ ] 根据权重,随机选取单词本中单词
0%