视觉棋盘游戏是一个统一的游戏,在这里我创建了一个地图和一个网格。可视化是这样的:

使这段代码显然需要嵌套在循环之类的代码中,但是开发它时,我的态度主要是“随心所欲”,这意味着我现在有了相当混乱的代码。
我已经创建了一个包含我所有代码的类,我相信我需要对我的变量进行一些清理,或者将一些方法转移到其他类中?
using UnityEngine;
using System.Collections;
public class gridInit : MonoBehaviour {
static int mapWidth = 33;
static int mapHeight = -27;
static float tileSizeUnits = 0.333333333333333333333f; this float is cancer, I'm sorry
public GameObject tile;
// Use this for initialization
void Start () {
GenerateObjects();
GenerateTileMap();
Screen.fullScreen = true;
}
void Awake()
{
}
// Update is called once per frame
void Update () {
}
bool walkable = false;
private void GenerateTileMap()
{
int tileNumber = 0;
for (float y = 0; y > mapHeight; y--)
{
for (float x = 0; x < mapWidth; x++)
{
tile.GetComponent<Renderer>().enabled = false;
GameObject go = Instantiate(tile, new Vector3(x/3, y/3, -2), Quaternion.identity) as GameObject;
tileNumber++;
go.name = "tile" + tileNumber;
go.tag = "grid";
RaycastHit2D hit;
Vector3 fwd = go.transform.TransformDirection(Vector3.forward);
Debug.DrawRay(go.transform.position, fwd * 50, Color.green);
hit = Physics2D.Raycast(go.transform.position, fwd, 200);
if (hit)
{
go.tag = "walkableGrid";
Debug.Log("works");
}
}
}
}
public GameObject center;
public GameObject stair;
public GameObject corner;
public GameObject straight;
public GameObject empty;
public GameObject stair90;
public GameObject stair180;
public GameObject stair270;
public GameObject corner90;
public GameObject corner180;
public GameObject corner270;
public GameObject straight90;
public GameObject mainCenter;
private void GenerateObjects()
{
GameObject[,] map = new GameObject[9, 11] { { empty, center, corner180, stair180, stair180, stair180, stair180, stair180, corner270, center, empty }, { center, center, straight, center, stair270, stair180, stair90, center, straight, center, center }, { straight, corner270, center, corner180, center, center, center, corner270, center, corner180, straight }, { corner, center, straight, center, center, stair180, center, center, straight, center, corner90 }, { stair270, center, center, center, stair270, mainCenter, stair90, center, center, center, stair90 }, { corner270, center, straight, center, center, stair, center, center, straight, center, corner180 }, { straight, corner, center, corner90, center, center, center, corner, center, corner90, straight }, { center, center, straight, center, stair270, stair, stair90, center, straight, center, center }, { empty, center, corner90, stair, stair, stair, stair, stair, corner, center, empty } };
int tileNumber = 0;
for(int i = 0; i < 9; i++)
{
for (int j = 0; j < 11; j++)
{
GameObject go = Instantiate(map[i,j], new Vector3(j + tileSizeUnits, (i * -1) - tileSizeUnits, 0), map[i,j].transform.rotation) as GameObject;
tileNumber++;
go.name = "object" + tileNumber;
go.tag = "path";
}
}
}
}发布于 2016-11-02 11:01:44
这不是强制性规则,但在camelCase中,类的C#有点奇怪。gridInit应该是GridInit。此外,您可能希望选择一个更好的名称。Init是明确的,但它无助于理解什么将被初始化(然后是这个类的责任)。类不是继承的,所以它也应该是sealed。
一致性。有时使用私有来表示private方法,有时则不使用(因为它是默认的)。这样或那样,但不要混淆,否则读者将不得不理解,如果他错过了什么.
使用static int mapWidth = 33;声明一个读/写公共字段。这里没几样东西。您不应该有公共可写字段。公共字段应该是PascalCase。您不需要static,而需要const。对所有这些人来说都是如此。
声明tileSizeUnits为const float TileSizeUnits = 1.0f / 3;不是更容易吗?
当您想公开类之外的对象时,应该使用只读属性:public GameObject Tile { get; private set; }。我强烈怀疑您是否需要所有这些公共对象(它们不只是实现细节吗?这仅仅是一个工厂的阶级吗?)但我没有看到周围的所有代码,所以我只是猜测。我认为更糟糕的是,您保存了很多对象,而这个类只处理一些初始化代码。对于一个类来说,做的还不够,对于一个方法也做得太多。我认为如果你把它合并成调用代码,你就会更容易读懂代码.
GenerateTileMap()有一些神奇的数字。从它们中生成常量,读者就不需要理解(猜测)它们是什么。
在GenerateObjects()中,我不认为需要map对象。2D数组不是最容易读取的东西(特别是在以这种方式初始化时,至少不要让它变成一行)。一个单独的for (在需要时使用整数除法和模数来计算行/列)要容易得多(IMO)。问题(我认为)是,在这里,您正在接收一堆对象,但逻辑在其他地方。
发布于 2016-11-02 11:09:38
@阿德里亚诺·雷佩蒂列出了许多问题,我只有一条简短的评论.
GameObject,
如果没有必要,就不应该使用多维数组。Linq不能和他们一起工作。最好使用交错数组GameObject[][]
https://codereview.stackexchange.com/questions/145912
复制相似问题