Question by
Aubergine111 · Apr 19 at 10:02 AM ·
scripting problem
script works fine but when i move to random axis while there isnt saved tile then it instantly breaks by 25% chance
This script works fine but when i move to random axis while there isnt saved tile then it instantly breaks by 25% chance.
I don't know why this script breaks sometimes and sometimes doesn't. anyone can fix this?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class Floor0Manager : MonoBehaviour
{
public List<Floor0ChunkData> LoadedChunkData = new List<Floor0ChunkData> ();
public List<GameObject> DebugObjList = new List<GameObject> ();
public List<Floor0ChunkData> floor0ChunkData = new List<Floor0ChunkData>();
public List<Floor0ChunkData> LoadingChunkData = new List<Floor0ChunkData>();
public Setting Setting;
public GameObject[] CorridorAsset;
public GameObject[] RoomAsset;
public Transform Transform;
int chunknum = 0;
int loadingChunkNum = 0;
public bool isLoaded = false;
RaycastHit hit;
public int TileSize;
public Vector3 ChunkPosition = Vector3.zero;
int i, j;
private void Awake()
{
JsonLoader();
string JsonSettingImport = File.ReadAllText(Application.persistentDataPath + "/settings.cfg");
Setting = JsonUtility.FromJson<Setting>(JsonSettingImport);
}
private void Start()
{
Transform = GameObject.FindGameObjectWithTag("Player").transform;
StartCoroutine(ChunkUpdater());
}
private void FixedUpdate()
{
DeleteTile();
}
IEnumerator ChunkUpdater() //run 7m code per sec when placed in fixedupdate so this run 2 times per sec so it run 280k code per sec
{
//still need a lot of optimization
for (i = Setting.RenderDistance * -1; i <= Setting.RenderDistance; i++)
for (j = Setting.RenderDistance * -1; j <= Setting.RenderDistance; j++)
{
if (!Physics.Raycast(new Vector3(((int)Transform.transform.position.x / TileSize + i) * TileSize, 3, ((int)Transform.transform.position.z / TileSize + j) * TileSize), Transform.transform.TransformDirection(Vector3.down), out hit, 7f))
{
isLoaded = LoadTile((int)Transform.transform.position.x / TileSize + i, (int)Transform.transform.position.z / TileSize + j);
if (isLoaded == false) MakeTile(i, j);
}
isLoaded = false;
}
yield return new WaitForSeconds(1f);
StartCoroutine(ChunkUpdater());
}
void MakeTile(int i, int j)
{
GameObject Tile;
int TileName;
int TileType;
switch (Random.Range(0, 15))
{
case 14: TileName = Random.Range(0, RoomAsset.Length); TileType = 0; Tile = Instantiate(RoomAsset[TileName]); break;
case 13: TileName = Random.Range(6, CorridorAsset.Length); TileType = 1; Tile = Instantiate(CorridorAsset[TileName]); break;
case 12: TileName = Random.Range(1, 8); TileType = 1; Tile = Instantiate(CorridorAsset[TileName]); break;
case 11: TileName = Random.Range(0, 6); TileType = 1; Tile = Instantiate(CorridorAsset[TileName]); break;
case 10:
case 9:
case 8:
case 7: TileName = 0; TileType = 1; Tile = Instantiate(CorridorAsset[TileName]); break;
default: TileName = Random.Range(0, 8); TileType = 1; Tile = Instantiate(CorridorAsset[TileName]); break;
}
Tile.transform.SetParent(transform);
Tile.transform.position = new Vector3(((int)Transform.transform.position.x / TileSize + i) * TileSize, 2.5f, ((int)Transform.transform.position.z / TileSize + j) * TileSize);
ChunkPosition = new Vector3(Tile.transform.position.x / TileSize, 0, Tile.transform.position.z / TileSize);
JsonSaver((int)ChunkPosition.x, (int)ChunkPosition.z, TileType, TileName, chunknum, 1);
LoadedChunkData.Add(floor0ChunkData[chunknum]);
DebugObjList.Add(Tile);//where this code broke
chunknum++;
}
bool DeleteTile()
{
int int1;
for (int1 = 0; int1 < DebugObjList.Count; int1++)
{
if ((int)DebugObjList[int1].transform.position.x / TileSize >= (int)Transform.transform.position.x / TileSize + Setting.RenderDistance + 1 || (int)DebugObjList[int1].transform.position.x / TileSize <= (int)Transform.transform.position.x / TileSize + Setting.RenderDistance * -1 - 1)
{
GameObject.Destroy(DebugObjList[int1]);
DebugObjList.RemoveAt(int1);
LoadedChunkData.RemoveAt(int1);
}
else if ((int)DebugObjList[int1].transform.position.z / TileSize >= (int)Transform.transform.position.z / TileSize + Setting.RenderDistance + 1 || (int)DebugObjList[int1].transform.position.z / TileSize <= (int)Transform.transform.position.z / TileSize + Setting.RenderDistance * -1 - 1)
{
GameObject.Destroy(DebugObjList[int1]);
DebugObjList.RemoveAt(int1);
LoadedChunkData.RemoveAt(int1);
}
}
return true;
}
bool LoadTile(int x, int z)
{
if(File.Exists(Application.persistentDataPath + "/Floor0Data.json"))
{
GameObject Tile;
int TileName, TileType, XAxis, ZAxis, onUse = 0;
for (loadingChunkNum = 0; loadingChunkNum < floor0ChunkData.Count; loadingChunkNum++)
{
if (floor0ChunkData[loadingChunkNum].chunkx == x && floor0ChunkData[loadingChunkNum].chunkz == z)
{
TileName = floor0ChunkData[loadingChunkNum].tilename;
TileType = floor0ChunkData[loadingChunkNum].tiletype;
XAxis = floor0ChunkData[loadingChunkNum].chunkx;
ZAxis = floor0ChunkData[loadingChunkNum].chunkz;
onUse = floor0ChunkData[loadingChunkNum].onuse;
if (TileType == 0)
Tile = Instantiate(RoomAsset[TileName]);
else
Tile = Instantiate(CorridorAsset[TileName]);
Tile.transform.SetParent(transform);
Tile.transform.position = new Vector3(XAxis * TileSize, 2.5f, ZAxis * TileSize);
LoadedChunkData.Add(floor0ChunkData[loadingChunkNum]);
DebugObjList.Add(Tile);
chunknum++;
break;
}
}
if (onUse != 0) return true;
else return false;
}
return false;
}
void JsonSaver(int chunkx, int chunkz, int tiletype, int tilename, int chunknum, int onuse)
{
Floor0ChunkData savedata = new Floor0ChunkData();
savedata.chunkx = chunkx;
savedata.chunkz = chunkz;
savedata.tiletype = tiletype;
savedata.tilename = tilename;
savedata.onuse = onuse;
floor0ChunkData.Add(savedata);
string JsonTileExport = JsonHelper.ToJson(floor0ChunkData, true);
Debug.Log(JsonTileExport);
File.WriteAllText(Application.dataPath + "/Floor0Data.json", JsonTileExport);
File.WriteAllText(Application.persistentDataPath + "/Floor0Data.json", JsonTileExport);
}
void JsonLoader()
{
if (File.Exists(Application.persistentDataPath + "/Floor0Data.json"))
{
string jsonString = File.ReadAllText(Application.persistentDataPath + "/Floor0Data.json");
floor0ChunkData = JsonHelper.FromJson<Floor0ChunkData>(jsonString);
}
else File.Create(Application.persistentDataPath + "/Floor0Data.json");
}
}
public static class JsonHelper
{
public static List<T> FromJson<T>(string json)
{
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
return wrapper.items;
}
public static string ToJson<T>(List<T> array)
{
Wrapper<T> wrapper = new Wrapper<T> ();
wrapper.items = array;
return JsonUtility.ToJson(wrapper);
}
public static string ToJson<T>(List<T> array, bool prettyPrint)
{
Wrapper<T> wrapper = new Wrapper<T> ();
wrapper.items = array;
return JsonUtility.ToJson (wrapper, prettyPrint);
}
[System.Serializable]
private class Wrapper<T>
{
public List<T> items;
}
}
[System.Serializable]
public class Setting
{
[Header("Control")]
public int MouseSpeed = 10;
public float FieldOfView = 90;
public float ZoomScale = 4;
public float ZoomDuration = 0.5f;
[Header("Perfomence")]
public int RenderDistance = 12;
}
[System.Serializable]
public class Floor0ChunkData
{
[Header("ChunkData")]
public int chunkx;
public int chunkz;
public int tiletype;
public int tilename;
public int onuse;
}
화면-캡처-2022-04-14-223924.jpg
(188.6 kB)
Comment
How does it get broken? Does editor crash or do you get an error thrown? If an error, what is it?
Your answer
![](https://koobas.hobune.stream/wayback/20220613055400im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Ammo Script 0 Answers
How to use the GPGS ISavedGameMetadata? 1 Answer
How do I get the screen to fade in when a trigger is triggered? 0 Answers