最近迷上了一款名为“烟雨江湖”的2D游戏,而自己作为一个游戏开发者,自然也会好奇其中的某些功能是如何实现的。
当然作为刚入行不久的我只是一个菜鸟,所以就从比较简单的功能开始,如下图:
游戏内有一个轻功机制,当你学了不同的轻功之后也会有不同的效果,比如可以水面行走等;但总的来说大多为陆地上的可跳跃机制,只是可跳跃格数,也就是距离不同而已。
由于个人能力、时间有限,所以暂时不考虑障碍、水面、多段跳跃等问题。话不多说,我们正式开始:
首先确定一下思路,当我们点击玩家的时候要根据玩家所在的格子以及可跳跃格数来获得上下左右四个方向的可移动格子,下面是我的几个想法:
- 格子不用数据结构进行存储,而是采用2D碰撞或者检测的方法来获得相应的格子,现在想想这个想法有点好笑
- 格子用List列表存储,写一个可以获得玩家移动距离为1的格子的方法(方法体内为循环遍历加距离判断),而后再以得到的格子作为参数递归执行此方法,所以只要加一个跳出语句就可以了。最终此方法可行,但问题也很明显,每次执行此方法都要循环一遍List加距离判断,计算量巨大
- 采用字典存储,用一个Vector2值存储行列并作为键,最终我们只需要在行列数上进行加减就能获得相应的格子,此方法运算量小且无任何差错。
新建项目,并创建一个UI-Panel更名为IconParent作为格子父物体,而后新建一个脚本并挂载到Canvas上,脚本如下:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class TestScene : MonoBehaviour
{
Dictionary<Vector2, GameObject> iconGamesValues = new Dictionary<Vector2, GameObject>();//存放所有格子行列的字典
Transform iconParent;
GameObject player;//玩家
Vector2 playerParentVec;//玩家所占格子的行列数
private void Start()
{
iconParent = transform.Find("IconParent");
StartCoroutine(_CreateIcon());
}
IEnumerator _CreateIcon()
{
for (int i = 0; i < 17; i++)//生成格子
{
for (int j = 0; j < 31; j++)
{
GameObject icon = new GameObject("Icon");
icon.transform.SetParent(iconParent);
RectTransform iconRect = icon.AddComponent<RectTransform>();
iconRect.sizeDelta