1. 程式人生 > >遊戲編程精粹學習 - 可預測隨機數

遊戲編程精粹學習 - 可預測隨機數

value seed init ria public bject Go getc 數字

技術分享圖片

一種避免一次性生成所有內容的可預測隨機數實現

原文使用了簡易的隨機數生成算法來生成,可以支持的最大數字是uint型的最大值。

文中提到的宏無限分解和微無限分解指的是用種子生成的隨機結果再作為種子繼續生成,細化到具體星球,植被等等。

這樣當玩家在任意坐標區域內,只需要生成附近一小塊的隨機內容。這種做法也可以衍生到寶藏藏匿之類的實現上去。

這裏測試代碼使用unity自己的隨機數來實現,也就是上面gif圖的效果:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class
InfinityPlanet : MonoBehaviour { public int x; public int y; public int probability = 70; List<GameObject> mCreatedCubeList = new List<GameObject>(); void Update() { GetArea(x - 10, y - 10, x + 10, y + 10); } void GetArea(int beginX, int beginY, int
endX, int endY) { for (int i = 0; i < mCreatedCubeList.Count; i++) Destroy(mCreatedCubeList[i]); var cacheState = Random.state; mCreatedCubeList.Clear(); for (int x = beginX; x < endX; x++) { for (int y = beginY; y < endY; y++) { Random.InitState(x
+ y * x); var r = (int)(Random.value * 100); if (r % 100 < probability) { var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position = new Vector3(x, 0, y); GalaxyBuild(r, cube); mCreatedCubeList.Add(cube); } } } Random.state = cacheState; } void GalaxyBuild(int seed, GameObject go) { var cacheState = Random.state; Random.InitState(seed); var meshRenderer = go.GetComponent<MeshRenderer>(); switch ((int)(Random.value * 100 % 3)) { case 0://行星類型1 meshRenderer.material.color = Color.red; break; case 1://行星類型2 meshRenderer.material.color = Color.blue; break; case 2://行星類型3 meshRenderer.material.color = Color.green; break; } Random.state = cacheState; } }

遊戲編程精粹學習 - 可預測隨機數