(长期更新)妖狸替、走格子与其他小游戏

楼主在2021年注册了妖狸替账号,2024年年末因为学业相关事务需要学习和使用Unity。在经过将近半年的摸爬滚打之后,已初步具备一定的研发能力(大雾).

  • 长期更新,但时不时会咕
  • 开发环境:Unity 2022.3.52f1
3 个赞


楼主因为账号很早就注册了,甚至可以下载Unity 6。
不过2D游戏不需要太先进的轮子 :rofl:

2 个赞

先来点抽象数据结构设计:
走格子的地图,其数据结构的初步设计大致思路是:

grids: [
	{id: 0,layer:0, left: -1, right: -1, top: -1, bottom: -1, content: {...}, jump: -1},
	{id: 1,layer:0, left: -1, right: -1, top: -1, bottom: -1, content: {...}, jump: -1},
	{id: 2,layer:0, left: -1, right: -1, top: -1, bottom: -1, content: {...}, jump: -1},
	{id: 3,layer:0, left: -1, right: -1, top: -1, bottom: -1, content: {...}, jump: -1},
	……
]

每个格子都有自己的单独的非负数 id,
一个地图可以存在多层,layer表示其所在层数
jump表示这个格子可以跳转的格子的id
left、 right、 top、 bottom 属性分别代表与该格子相邻的格子的id,
content 就是每个格子拥有的内容,比如我们的角色、金币、敌人等等。

2 个赞

不同的格子内容,其具体效果是不同的。
我的半吊子编程水平,让我认为应该尝试使用多态
大致实现思路,就这样:

public abstract class GridContent {...}

public class Enemy : GridContent
{...}

public class Coin : GridContent
{...}

public class Trap : GridContent
{...}
2 个赞

接着初步设计格子的管理类。
因为楼主本人太菜,格子直接使用2d贴图来表现 :rofl:

//头文件忽略
public class MapGrid : MonoBehaviour
{
	[SerializeField] private Sprite FrameSprite;
	[SerializeField] private SpriteRenderer Frame;
	[SerializeField] private MapGridContent GridContent;
	
	private void Awake()
	{
		SetFrameImage(GridFrame);
	}

	public void SetFrameImage(Sprite frameImage)
	{	
		Frame.sprite = framImage;
	}

	public void SetLocation(Vector3 position)
	{
		gameObject.anchoredPosition = position;
	}
}

游戏场景初始化时,会设置好格子边框的贴图。
SetLocation 函数可以设置每个格子的具体位置。

2 个赞

坛友们,今天先开个头
后续更新思路是:

  • 制作地图格子的预制体
  • 地图管理类的设计与实现
  • 如何初始化地图
  • 创建玩家、起点和终点

楼主所在的 🇳🇿 有比较特殊的中期休息机制,所以才有时间整花活。
今天我还要过铁道的主线剧情 :rofl:

3 个赞

期待一下二创小游戏 :a:

是大佬,期待大佬的成品 :bt_001:

好欸,期待期待 :ys_088:

  • “你今天做了什么?”
  • “超市购物、三个游戏的周常、原&绝的活动、星穹铁道的主线和两个大活动,还有在专楼吧论坛发帖构思小游戏”
  • “原来如此,那么明天呢?”

:rofl: :rofl: :rofl:
楼主因为之前的时间太过紧张,最近还要大赶特赶游戏进度
还要啃火山地图和星穹铁道的地图

另,附:
楼主的美术素材参考网站:

相当一部分透明背景的png图片,可以直接在该网站搜索和下载

期待,也学习观摩 :bt_004:

楼主回来了,经过实操,
格子预制体的设计和实现,虽然很塑料,还是耗费了亿点点时间和精力。(大嘘)

  • 格子边框使用的是胶卷底片,和绝的电视屏幕有所区分
  • 格子中我随便写的 1234 ,这个地方对于不同的格子,会有不同的图案
  • 格子左下角最多可以显示三个指标:生命值、攻击力和护盾值
1 个赞

楼主这边开始敲代码了,但今天上午只敲了一点点:

  • GridMap 存储地图格子的相关数据
  • GridContent 是所有地图格子内容的基类,GridContentEmpty 是其子类,代表一个不会触发任何事件的空格子。在后续开发中,每个格子内容都需要定义不同的类控制其逻辑
  • AllGridContentList 存储所有不同格子内容相关数据,以供 GridMapDisplayManager 调用
  • GridMapDisplayManager 就是负责显示和初始化格子地图的管理类
1 个赞

格子地图的数据结构如上图所示。Grids是一个存储格子信息的列表。
很明显,在 Unity 上直接编辑格子地图的数据信息,是不方便的。
所以,新的思路和解决方法马上出来了:

  1. Excel中编辑或者创建格子地图
  2. 将文件导出为 csv 文件
  3. csv 文件的数据导入 Unity 中

所以,需要定义新的 GridMapImporter类,帮助我们将 csv 文件导入和转换为我们需要的格子地图数据

1 个赞

今天暂时就这些。
因为制作地图格子预制体那个步骤,花的时间稍微长了点。
下午开始啃原神地图宝箱。 :laughing:

远古圣山的地图差了几个宝箱,不管了
自我反思、优化和灵感,有些时候是突然出现的,可能需要一个契机。

“为什么你的格子地图,不使用二维数组存储信息?”
“一些地图的形状是不规则的(甚至大部分都是不规则的),用二维数组存储信息,很多格子会被浪费”
“所以你使用了列表?如果你这样做,游戏程序显示格子地图的模块,其算法会很复杂。”
“这我知道,我在思考有没有一种可以兼得的方法”

灵感和改进思路来得十分意外。修改格子的数据结构:

//格子原本的数据结构:
{id: 0,layer:0, left: -1, right: -1, top: -1, bottom: -1, content: {...}, jump: -1}
//格子新的数据结构:
{id: 0,layer:0, 
row: 0, column: 0, // 添加两个整数,分别代表其在二维数组的行索引和列索引
left: -1, right: -1, top: -1, bottom: -1,  //原本的四个属性可以废弃使用,也可以暂时保留
content: {...}, jump: -1}
  • 虽然没有实际使用二维数组,但是每个格子在二维数组中的行索引和列索引被记录在了每个格子中。
  • 只要知道了格子预制体的宽度和高度,不同格子之间的相对位置,可以使用行索引和列索引之差计算出来。

一些小问题的解决,不需要什么惊天动人的大创新,而是 “小灵感”

1 个赞

今天还可以再发一两帖。
先是一句比较重要的话,

一个逻辑自洽的游戏,不管体量大小,与核心玩法对应的UI设计,其工作量和重要性不可忽视

这话听起来可能莫名其妙,但是,他山之石,可以攻玉。
绝区零恰好就是这个例子。

这是工作簿、空洞见闻界面

  • 区域1和区域3是两个按钮,区域4和区域6是显示文本的区域。区域6显示的具体文本取决于玩家在区域2和区域5的具体选择。
  • 区域2和区域5,很明显,拥有一定UI开发经验的坛友知道,均使用了 ScrollView 控件。只不过区域2的按钮是竖直排列(Vertical Layout)、区域5的按钮是格子网状排列(Grid Layout)
  • 这是一个比较简单的界面
1 个赞

看看走格子的界面:

  1. 左上角有一个二倍速按钮,二倍速相关的功能暂时不是我的前期开发内容 :rofl:
  2. 左侧的工具栏可以展开,并且显示玩家在当期地图所拥有的道具和邦布
  3. 下侧除了可以显示玩家当前拥有的齿轮货币和丁尼,还可以弹出新的窗口,详细显示玩家背包中的所有物品
  4. 当玩家按下 ESC 键时,游戏会显示当前地图的任务是否已经完成,甚至可以直接修改游戏设置。一些绝玩家比较清楚,有些时候,这个面板甚至会显示每个代理人的出招表
  5. 当玩家第一次进入一些具有特定事件的格子时,摄像头会移动和改变焦距,左侧显示格子内容,右侧渐显这个格子特殊事件的描述文本以及各个选项对应的按钮。不过,我在这一部分有相应的替代方法。那是后话了 :melting_face:
1 个赞