我是学生,我学习Unity3D引擎。我开始从事小型2D游戏。
我需要一些游戏逻辑方面的帮助。具体如何在4列中合理生成游戏对象。在这个游戏中,我产生了从屏幕顶部掉下来的游戏对象。我计算了4个覆盖屏幕的列。我在这4列中随机生成游戏对象。但是玩游戏并不好。我需要一个如何做得更好的建议。
我的想法是在行中生成一个或多个游戏对象并合理地旋转列。我已经在行中生成了对象。但是如何为切换列创建逻辑呢?像switch这样的东西(现在是第一列,现在是第三列,现在是第一列和第四列等)
有我的产卵方法:
// Use this for initialization
void Start ()
{
// width of one colums
widthColum = ScreenCalc.DivideScreenInColums(colums);
...
}
public void StartSpawn()
{
spawn = StartCoroutine(Spawn());
}
IEnumerator Spawn()
{
yield return new WaitForSeconds(1.5f);
time = GameController.instance.time;
while (true)
{
// Random select from prefabs
GameObject geometryObject = spawnObjects[Random.Range(0, spawnObjects.Length)];
// X is middle of random picked columns
float x = ScreenCalc.GenerateColumPos(geometryObject, colums);
Vector3 spawnPosition = new Vector3(x, transform.position.y, 0.0f);
Quaternion spawnRotation = Quaternion.identity;
// Random object in row, will be spawned in one column
int rnd = Random.Range(1, 6);
// Spawn random count game object in one row
for (int i = 0; i < rnd; i++)
{
GameObject temp = Instantiate(geometryObject, spawnPosition, spawnRotation);
// Get Sprite render
SpriteRenderer sr = temp.GetComponent<SpriteRenderer>();
// Change color of game object
sr.color = colors[Random.Range(0, colors.Length)];
// Get script for falling down
FallingDown fl = temp.GetComponent<FallingDown>();
// Increase fall
fl.fallSpeed += 0.1f;
// Wait between spawns
yield return new WaitForSeconds(Random.Range(0.35f, 1.0f));
}
yield return new WaitForSeconds(1.0f);
}
我尝试了更多的Spawn方法,每列一个并随机生成等待时间。但我的逻辑很糟糕,因为生成的对象太多或太低而且彼此碰撞一列。
这是我的想法的图片。
在图片上你可以看到屏幕分为4列,每列都是产卵位置。我需要帮助游戏逻辑如何随机切换对象的产生。
例如,在第一列中的行中生成3个对象。然后在第二列中生成一个对象。然后在第二列中生成5个对象,同时在第四列中生成2个对象。
我不知道如何更好地解释它。我很抱歉我的英语。
答案 0 :(得分:1)
你可能会要求一种算法以一种游戏看起来很有趣的方式产生游戏对象,也许这种模式可以帮助你(你可以添加更多步骤)。
答案 1 :(得分:1)
我认为你想要在每一列中独立于其他列产生。
您可以为4列添加4个spawner脚本
在这4个脚本上设置唯一的列位置(x)
或者您可以为4列启动4个协同程序,如:
public void StartSpawn()
{
StartCoroutine(Spawn(columnPos1));
StartCoroutine(Spawn(columnPos2));
StartCoroutine(Spawn(columnPos3));
StartCoroutine(Spawn(columnPos4));
}
IEnumerator Spawn(float columnPos)
{
yield return new WaitForSeconds(1.5f);
time = GameController.instance.time;
while (true)
{
// Random select from prefabs
GameObject geometryObject = spawnObjects[Random.Range(0, spawnObjects.Length)];
// X is middle of random picked columns
float x = columnPos;
Vector3 spawnPosition = new Vector3(x, transform.position.y, 0.0f);
Quaternion spawnRotation = Quaternion.identity;
// Random object in row, will be spawned in one column
int rnd = Random.Range(1, 6);
// Spawn random count game object in one row
for (int i = 0; i < rnd; i++)
{
GameObject temp = Instantiate(geometryObject, spawnPosition, spawnRotation);
// Get Sprite render
SpriteRenderer sr = temp.GetComponent<SpriteRenderer>();
// Change color of game object
sr.color = colors[Random.Range(0, colors.Length)];
// Get script for falling down
FallingDown fl = temp.GetComponent<FallingDown>();
// Increase fall
fl.fallSpeed += 0.1f;
// Wait between spawns
yield return new WaitForSeconds(Random.Range(0.35f, 1.0f));
}
yield return new WaitForSeconds(1.0f);
}