Work on architecture. A lot of refractoring. Updated to unity 5.
This commit is contained in:
@ -11,7 +11,7 @@ namespace TransportGame.Business
|
||||
{
|
||||
public static class BiomeManager
|
||||
{
|
||||
private static Dictionary<string, Biome> biomes = new Dictionary<string, Biome>();
|
||||
private static List<Biome> biomes = new List<Biome>();
|
||||
|
||||
/// <summary>
|
||||
/// Gets all the loaded biomes
|
||||
@ -20,7 +20,7 @@ namespace TransportGame.Business
|
||||
{
|
||||
get
|
||||
{
|
||||
return biomes.Values;
|
||||
return biomes;
|
||||
}
|
||||
}
|
||||
|
||||
@ -41,7 +41,7 @@ namespace TransportGame.Business
|
||||
var biome = (Biome)serializer.Deserialize(stream);
|
||||
|
||||
// Add it to biome list
|
||||
biomes.Add(file, biome);
|
||||
biomes.Add(biome);
|
||||
Logger.Info("Loaded biome '{0}' from file '{1}'.", biome.Name, file);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -1,8 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Xml.Serialization;
|
||||
using Assets.Scripts.Model.Config;
|
||||
using TransportGame.Utils;
|
||||
|
||||
namespace TransportGame.Business
|
||||
{
|
||||
@ -11,10 +14,14 @@ namespace TransportGame.Business
|
||||
public static readonly string BiomeDirectory = "Assets\\Data\\Biomes";
|
||||
public static readonly string ConfigurationDirectory = "Assets\\Data\\Config";
|
||||
|
||||
public static readonly string TerrGenConfigFile = "tergen.xml";
|
||||
|
||||
public static TerrainGeneratorConfig TerrGenConfig { get; private set; }
|
||||
|
||||
public static void LoadConfiguration()
|
||||
{
|
||||
// Load terrgen config
|
||||
TerrGenConfig = XmlHelper.Deserialize<TerrainGeneratorConfig>(Path.Combine(ConfigurationDirectory, TerrGenConfigFile));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,155 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using TransportGame.Model;
|
||||
using TransportGame.Utils;
|
||||
using UnityEngine;
|
||||
|
||||
namespace TransportGame.Generators
|
||||
{
|
||||
public static class MapImageRenderer
|
||||
{
|
||||
[Flags]
|
||||
public enum Layers
|
||||
{
|
||||
None = 0,
|
||||
Elevation = 1,
|
||||
Grid = 2,
|
||||
Centers = 4,
|
||||
All = Elevation | Grid | Centers
|
||||
};
|
||||
|
||||
private const int Scale = 20;
|
||||
|
||||
/// <summary>
|
||||
/// Renders a map to a file
|
||||
/// </summary>
|
||||
/// <param name="file"></param>
|
||||
/// <param name="map"></param>
|
||||
/// <param name="layers"></param>
|
||||
//public static void Render(this Map map, string file, Layers layers = Layers.All)
|
||||
//{
|
||||
// // Create texture on which to draw
|
||||
// Texture2D texture = new Texture2D(
|
||||
// map.Width * Scale,
|
||||
// map.Height * Scale,
|
||||
// TextureFormat.RGB24,
|
||||
// false);
|
||||
|
||||
// // First layer - cells
|
||||
// DrawCells(texture, map, (layers & Layers.Elevation) > 0, (layers & Layers.Centers) > 0);
|
||||
|
||||
// // Second layer - grid
|
||||
// if ((layers & Layers.Grid) > 0)
|
||||
// DrawGrid(texture, map);
|
||||
|
||||
// // Write to file
|
||||
// File.WriteAllBytes(file + ".png", texture.EncodeToPNG());
|
||||
//}
|
||||
|
||||
//private static void DrawCells(Texture2D texture, Map map, bool elevation, bool centers)
|
||||
//{
|
||||
// for (int x = 0; x < map.Width; x++)
|
||||
// for (int y = 0; y < map.Height; y++)
|
||||
// {
|
||||
// // Calculate scaled corners
|
||||
// Vector2 c00 = new Vector2(
|
||||
// map[x, y].Corner00.Pos.x * Scale,
|
||||
// map[x, y].Corner00.Pos.y * Scale);
|
||||
// Vector2 c01 = new Vector2(
|
||||
// map[x, y].Corner01.Pos.x * Scale,
|
||||
// map[x, y].Corner01.Pos.y * Scale);
|
||||
// Vector2 c10 = new Vector2(
|
||||
// map[x, y].Corner10.Pos.x * Scale,
|
||||
// map[x, y].Corner10.Pos.y * Scale);
|
||||
// Vector2 c11 = new Vector2(
|
||||
// map[x, y].Corner11.Pos.x * Scale,
|
||||
// map[x, y].Corner11.Pos.y * Scale);
|
||||
|
||||
// // Calculate color
|
||||
// Color c = ColorHelper.FromArgb(0x555500);
|
||||
|
||||
// // Water - always blue
|
||||
// if (map.IsWater(x, y))
|
||||
// c = Color.blue;
|
||||
|
||||
// // Map type is elevation map - get elevation color
|
||||
// else if (elevation)
|
||||
// c = GetCollorOfTerrain(map[x, y].Elevation);
|
||||
|
||||
// // Draw polygon
|
||||
// texture.FillPolygon(c, c00, c01, c11, c10);
|
||||
|
||||
// // Draw center
|
||||
// if (centers)
|
||||
// texture.DrawPoint(Color.red,
|
||||
// Convert.ToInt32(map[x, y].Center.x * Scale),
|
||||
// Convert.ToInt32(map[x, y].Center.y * Scale),
|
||||
// 2);
|
||||
// }
|
||||
//}
|
||||
|
||||
//private static void DrawGrid(Texture2D texture, Map map)
|
||||
//{
|
||||
// for (int x = 0; x < map.Width + 1; x++)
|
||||
// for (int y = 0; y < map.Height + 1; y++)
|
||||
// {
|
||||
// Corner c0 = map.Corner(x, y);
|
||||
// Vector2 c0pos = new Vector2(c0.Pos.x * Scale, c0.Pos.y * Scale);
|
||||
|
||||
// // Draw edges
|
||||
// if (x > 0)
|
||||
// {
|
||||
// Corner c1 = map.Corner(x - 1, y);
|
||||
// Vector2 c1pos = new Vector2(c1.Pos.x * Scale, c1.Pos.y * Scale);
|
||||
// texture.DrawLine(Color.white, c0pos, c1pos);
|
||||
// }
|
||||
// if (y > 0)
|
||||
// {
|
||||
// Corner c1 = map.Corner(x, y - 1);
|
||||
// Vector2 c1pos = new Vector2(c1.Pos.x * Scale, c1.Pos.y * Scale);
|
||||
// texture.DrawLine(Color.white, c0pos, c1pos);
|
||||
// }
|
||||
|
||||
// // Draw corner
|
||||
// texture.DrawPoint(Color.white, c0pos, 2);
|
||||
// }
|
||||
//}
|
||||
|
||||
private static Color GetCollorOfTerrain(float height)
|
||||
{
|
||||
Color color1, color2;
|
||||
float alpha;
|
||||
|
||||
if (height < 10f)
|
||||
{
|
||||
color1 = ColorHelper.FromArgb(0x00ffa2);
|
||||
color2 = ColorHelper.FromArgb(0xFCD628);
|
||||
alpha = height / 10f;
|
||||
}
|
||||
|
||||
else if (height < 25f)
|
||||
{
|
||||
color1 = ColorHelper.FromArgb(0xFCD628);
|
||||
color2 = ColorHelper.FromArgb(0x9C6713);
|
||||
alpha = (height - 10f) / 15f;
|
||||
}
|
||||
|
||||
else if (height < 50f)
|
||||
{
|
||||
color1 = ColorHelper.FromArgb(0xaaaaaa);
|
||||
color2 = ColorHelper.FromArgb(0xffffff);
|
||||
alpha = (height - 25f) / 25f;
|
||||
}
|
||||
else
|
||||
{
|
||||
color1 = color2 = Color.white;
|
||||
alpha = 1;
|
||||
}
|
||||
|
||||
return Color.Lerp(color1, color2, alpha);
|
||||
}
|
||||
}
|
||||
}
|
@ -20,6 +20,10 @@ namespace TransportGame.Generator
|
||||
public TerrainGenerator()
|
||||
{
|
||||
Noise = new PerlinNoiseGenerator();
|
||||
|
||||
if (ConfigurationManager.TerrGenConfig == null)
|
||||
throw new Exception("WTF?");
|
||||
|
||||
Noise.Octaves = ConfigurationManager.TerrGenConfig.NoiseOctaves;
|
||||
Noise.NonLinearPower = ConfigurationManager.TerrGenConfig.NoiseNonLinearPower;
|
||||
Noise.Scale = ConfigurationManager.TerrGenConfig.ElevationScale;
|
||||
@ -32,6 +36,7 @@ namespace TransportGame.Generator
|
||||
|
||||
// Pick a random biome
|
||||
map.Biome = PickBiome();
|
||||
Logger.Info("Picked biome: {0}", map.Biome.Name);
|
||||
|
||||
// Generate elevation
|
||||
GenerateElevation(map);
|
||||
@ -40,6 +45,7 @@ namespace TransportGame.Generator
|
||||
float waterAmount = random.NextSingle(map.Biome.Moisture.Minimum, map.Biome.Moisture.Maximum);
|
||||
map.WaterLevel = Mathf.Pow(waterAmount, 3) * (map.Biome.HeightRange.Maximum - map.Biome.HeightRange.Minimum) + map.Biome.HeightRange.Minimum;
|
||||
|
||||
DumpData(map);
|
||||
return map;
|
||||
}
|
||||
|
||||
@ -57,5 +63,22 @@ namespace TransportGame.Generator
|
||||
for (int y = 0; y < map.Height; ++y)
|
||||
map[x, y] = Noise.Generate(x, y, map.Biome.HeightRange.Minimum, map.Biome.HeightRange.Maximum);
|
||||
}
|
||||
|
||||
private void DumpData(Map map)
|
||||
{
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
for (int x = 0; x < map.Width; ++x)
|
||||
{
|
||||
for (int y = 0; y < map.Height; ++y)
|
||||
{
|
||||
builder.Append(map[x, y]);
|
||||
builder.Append(';');
|
||||
}
|
||||
builder.AppendLine();
|
||||
}
|
||||
|
||||
Logger.Info("Generated map: \n{0}", builder.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,109 +1,28 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using TransportGame.Utils;
|
||||
using TransportGame.Model;
|
||||
using TransportGame.Generators;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections;
|
||||
using System.Threading;
|
||||
using TransportGame.Business;
|
||||
using TransportGame.Model;
|
||||
using TransportGame.Utils;
|
||||
using UnityEngine;
|
||||
|
||||
public class InitializeScript : MonoBehaviour
|
||||
{
|
||||
public Material TerrainMaterial;
|
||||
public int TerrainWidth = 256, TerrainHeight = 256;
|
||||
|
||||
private Map map;
|
||||
|
||||
// Use this for initialization
|
||||
public void Start()
|
||||
{
|
||||
StartCoroutine(GenerateMap());
|
||||
}
|
||||
{
|
||||
// Load configuration
|
||||
Logger.Info("Loading configuration...");
|
||||
ConfigurationManager.LoadConfiguration();
|
||||
Logger.Info("Finished loading configuration.");
|
||||
|
||||
private IEnumerator GenerateMap()
|
||||
{
|
||||
// Load biomes
|
||||
Logger.Info("Loading biomes...");
|
||||
BiomeManager.LoadBiomes();
|
||||
Logger.Info("Finished loading biomes.");
|
||||
|
||||
// Generate map in the other thread
|
||||
Thread thread = new Thread(GenerateMapThread);
|
||||
thread.Start();
|
||||
|
||||
while (thread.ThreadState == ThreadState.Running)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
thread.Join();
|
||||
|
||||
// map.Render(@"C:\Users\Tiberiu\Desktop\img");
|
||||
|
||||
// Log - Generate mesh
|
||||
yield return null;
|
||||
Debug.Log("Generating mesh...");
|
||||
|
||||
var heights = new float[map.Width, map.Height];
|
||||
for (int x = 0; x < map.Width; x++)
|
||||
for (int y = 0; y < map.Height; y++)
|
||||
heights[x, y] = map[y, x] / 50f;
|
||||
|
||||
// Generate mesh using terraindata
|
||||
TerrainData terrainData = new TerrainData();
|
||||
terrainData.heightmapResolution = map.Width;
|
||||
terrainData.size = new Vector3(map.Width * MapMeshGenerator.Scale, 50.0f * MapMeshGenerator.Strength, map.Height * MapMeshGenerator.Scale);
|
||||
//terrainData.baseMapResolution = 1024;
|
||||
//terrainData.alphamapResolution = 512;
|
||||
terrainData.SetDetailResolution(1024, 8);
|
||||
terrainData.SetHeights(0, 0, heights);
|
||||
terrainData.name = "Le terrain data";
|
||||
|
||||
GameObject terrainObj = Terrain.CreateTerrainGameObject(terrainData);
|
||||
terrainObj.name = "Le Terrain";
|
||||
Terrain t1 = terrainObj.GetComponent<Terrain>();
|
||||
t1.heightmapPixelError = 1;
|
||||
|
||||
MapMeshGenerator meshGen = new MapMeshGenerator(map);
|
||||
//for (int x = 0; x < meshGen.ChunksWidth; x++)
|
||||
// for (int y = 0; y < meshGen.ChunksHeight; y++)
|
||||
// {
|
||||
// CreateGameObjectFromMesh(string.Format("chunk_{0}_{1}", x, y), meshGen[x, y], TerrainMaterial);
|
||||
// yield return null;
|
||||
// }
|
||||
|
||||
// Generate water
|
||||
GameObject water = GameObject.Find("Water");
|
||||
MeshFilter waterFilter = water.GetComponent<MeshFilter>();
|
||||
waterFilter.mesh = meshGen.Water;
|
||||
yield return null;
|
||||
|
||||
Debug.Log("Finished generating map.");
|
||||
yield return null;
|
||||
}
|
||||
|
||||
private void CreateGameObjectFromMesh(string name, Mesh mesh, Material material)
|
||||
{
|
||||
GameObject gameObject = new GameObject(name);
|
||||
|
||||
// Add mesh filter component
|
||||
MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();
|
||||
meshFilter.mesh = mesh;
|
||||
|
||||
// Add mesh render component
|
||||
MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
|
||||
meshRenderer.material = material;
|
||||
}
|
||||
|
||||
private void GenerateMapThread()
|
||||
{
|
||||
MapGenerator mapGen = new MapGenerator();
|
||||
map = mapGen.Generate(TerrainWidth, TerrainHeight);
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c1e1bcc13284685449456c96db1d1754
|
||||
timeCreated: 1425647800
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
executionOrder: -100
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
@ -9,11 +9,13 @@ namespace Assets.Scripts.Model.Config
|
||||
[XmlRoot("terrgenConfig")]
|
||||
public class TerrainGeneratorConfig
|
||||
{
|
||||
[XmlElement("noiseOctaves")]
|
||||
public int NoiseOctaves { get; set; }
|
||||
|
||||
[XmlElement("noiseNonLinearPower")]
|
||||
public float NoiseNonLinearPower { get; set; }
|
||||
|
||||
[XmlElement("elevationScale")]
|
||||
public float ElevationScale { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,17 @@ namespace TransportGame.Model
|
||||
/// </summary>
|
||||
public Biome Biome { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the heights array
|
||||
/// </summary>
|
||||
public float[,] Heights
|
||||
{
|
||||
get
|
||||
{
|
||||
return grid;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the map
|
||||
/// </summary>
|
||||
|
@ -1,15 +1,87 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
|
||||
public class TerrainGeneratorScript : MonoBehaviour {
|
||||
|
||||
// Use this for initialization
|
||||
void Start () {
|
||||
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update () {
|
||||
|
||||
}
|
||||
}
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using TransportGame.Utils;
|
||||
using System.Threading;
|
||||
using TransportGame.Generator;
|
||||
using TransportGame.Model;
|
||||
using TransportGame.Business;
|
||||
|
||||
public class TerrainGeneratorScript : MonoBehaviour
|
||||
{
|
||||
private Map map = null;
|
||||
|
||||
public int TerrainWidth = 256;
|
||||
public int TerrainHeight = 256;
|
||||
public GameObject WaterObject;
|
||||
|
||||
// Use this for initialization
|
||||
void Start()
|
||||
{
|
||||
StartCoroutine(GenerateMap());
|
||||
}
|
||||
|
||||
private void GenerateMapThread()
|
||||
{
|
||||
TerrainGenerator generator = new TerrainGenerator();
|
||||
map = generator.Generate(TerrainWidth, TerrainHeight);
|
||||
}
|
||||
|
||||
private Mesh GenerateWater()
|
||||
{
|
||||
Mesh water = new Mesh();
|
||||
water.name = "water";
|
||||
water.vertices = new[] {
|
||||
new Vector3(0, map.WaterLevel, 0),
|
||||
new Vector3(0, map.WaterLevel, map.Height),
|
||||
new Vector3(map.Width, map.WaterLevel, 0),
|
||||
new Vector3(map.Width, map.WaterLevel, map.Height)
|
||||
};
|
||||
water.triangles = new[] { 0, 1, 2, 2, 1, 3 };
|
||||
water.uv = new[] {
|
||||
new Vector2(0, 0),
|
||||
new Vector2(0, 1),
|
||||
new Vector2(1, 0),
|
||||
new Vector2(1, 1)
|
||||
};
|
||||
water.RecalculateNormals();
|
||||
|
||||
return water;
|
||||
}
|
||||
|
||||
private IEnumerator GenerateMap()
|
||||
{
|
||||
// Wait for the map generation thread
|
||||
foreach (var i in Task.RunAsync(GenerateMapThread))
|
||||
yield return i;
|
||||
|
||||
// Generate terrain data
|
||||
TerrainData terrainData = new TerrainData();
|
||||
terrainData.heightmapResolution = Mathf.Max(map.Height, map.Width);
|
||||
terrainData.size = new Vector3(map.Width, map.Biome.HeightRange.Maximum, map.Height);
|
||||
terrainData.SetDetailResolution(1024, 8);
|
||||
terrainData.SetHeights(0, 0, map.Heights);
|
||||
terrainData.name = "Generated Terrain Data";
|
||||
yield return null;
|
||||
|
||||
// Create terrain object
|
||||
GameObject terrain = Terrain.CreateTerrainGameObject(terrainData);
|
||||
terrain.name = "Generated Terrain";
|
||||
yield return null;
|
||||
|
||||
Terrain terrainComp = terrain.GetComponent<Terrain>();
|
||||
terrainComp.heightmapPixelError = 1;
|
||||
yield return null;
|
||||
|
||||
// Set water
|
||||
if (WaterObject != null)
|
||||
{
|
||||
MeshFilter waterMesh = WaterObject.GetComponent<MeshFilter>();
|
||||
waterMesh.mesh = GenerateWater();
|
||||
}
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ namespace TransportGame.Utils
|
||||
{
|
||||
public static class Logger
|
||||
{
|
||||
private static StreamWriter logFile;
|
||||
private static string logFile = null;
|
||||
|
||||
public enum Level
|
||||
{
|
||||
@ -23,28 +23,40 @@ namespace TransportGame.Utils
|
||||
// Open log file if not opened
|
||||
if (logFile == null)
|
||||
{
|
||||
logFile = new StreamWriter(String.Format("Logs\\{0}.log", DateTime.Now.Ticks));
|
||||
// Create logs folder
|
||||
if (!Directory.Exists("Logs"))
|
||||
Directory.CreateDirectory("Logs");
|
||||
|
||||
// Create log file
|
||||
logFile = String.Format("Logs\\{0}.log", DateTime.Now.Ticks);
|
||||
}
|
||||
|
||||
// Log to file
|
||||
logFile.Write("[{0}] ", Enum.GetName(typeof(Level), level));
|
||||
logFile.Write(DateTime.Now.ToLongTimeString());
|
||||
logFile.WriteLine(": " + format, args);
|
||||
|
||||
// Log to unity
|
||||
switch (level)
|
||||
lock (logFile)
|
||||
{
|
||||
case Level.Warning:
|
||||
UnityEngine.Debug.LogWarning(String.Format(format, args));
|
||||
break;
|
||||
using (var writer = new StreamWriter(logFile, true))
|
||||
{
|
||||
// Log to file
|
||||
writer.Write("[{0}] ", Enum.GetName(typeof(Level), level));
|
||||
writer.Write(DateTime.Now.ToString("%HH:%mm:%ss.%FFF"));
|
||||
writer.WriteLine(": " + format, args);
|
||||
writer.Close();
|
||||
}
|
||||
|
||||
case Level.Error:
|
||||
UnityEngine.Debug.LogError(String.Format(format, args));
|
||||
break;
|
||||
// Log to unity
|
||||
switch (level)
|
||||
{
|
||||
case Level.Warning:
|
||||
UnityEngine.Debug.LogWarning(String.Format(format, args));
|
||||
break;
|
||||
|
||||
case Level.Critical:
|
||||
UnityEngine.Debug.LogError(String.Format(format, args));
|
||||
break;
|
||||
case Level.Error:
|
||||
UnityEngine.Debug.LogError(String.Format(format, args));
|
||||
break;
|
||||
|
||||
case Level.Critical:
|
||||
UnityEngine.Debug.LogError(String.Format(format, args));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
56
Game/Assets/Scripts/Utils/Task.cs
Normal file
56
Game/Assets/Scripts/Utils/Task.cs
Normal file
@ -0,0 +1,56 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace TransportGame.Utils
|
||||
{
|
||||
public static class Task
|
||||
{
|
||||
private class TaskInfo
|
||||
{
|
||||
public Action Action { get; set; }
|
||||
public bool? Success { get; set; }
|
||||
public Exception ThrownException { get; set; }
|
||||
}
|
||||
|
||||
private static void RunAsync_ActionThread(object info)
|
||||
{
|
||||
TaskInfo taskInfo = (TaskInfo)info;
|
||||
|
||||
try
|
||||
{
|
||||
taskInfo.Action();
|
||||
taskInfo.Success = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
taskInfo.ThrownException = ex;
|
||||
taskInfo.Success = false;
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable RunAsync(Action action)
|
||||
{
|
||||
// Set up task info object
|
||||
TaskInfo taskInfo = new TaskInfo();
|
||||
taskInfo.Action = action;
|
||||
|
||||
// Start thread and wait
|
||||
var thread = new Thread(RunAsync_ActionThread);
|
||||
thread.Start(taskInfo);
|
||||
|
||||
// Wait for thread to finish
|
||||
while (thread.ThreadState == ThreadState.Running)
|
||||
yield return null;
|
||||
|
||||
thread.Join();
|
||||
|
||||
// Rethrow exception
|
||||
if (taskInfo.Success.HasValue && !taskInfo.Success.Value)
|
||||
throw new Exception("Task failed", taskInfo.ThrownException);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d89d584776261fe4b81720b3615755bb
|
||||
guid: e07530e47d7019b418499d12a7c29f35
|
||||
timeCreated: 1425923206
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
25
Game/Assets/Scripts/Utils/XmlHelper.cs
Normal file
25
Game/Assets/Scripts/Utils/XmlHelper.cs
Normal file
@ -0,0 +1,25 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace TransportGame.Utils
|
||||
{
|
||||
public static class XmlHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// Deserializes a file
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Type to deserialize</typeparam>
|
||||
/// <param name="filename">File name</param>
|
||||
/// <returns>Deserialized object</returns>
|
||||
public static T Deserialize<T>(string filename)
|
||||
{
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(T));
|
||||
var stream = new StreamReader(filename);
|
||||
return (T)serializer.Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
12
Game/Assets/Scripts/Utils/XmlHelper.cs.meta
Normal file
12
Game/Assets/Scripts/Utils/XmlHelper.cs.meta
Normal file
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a4d12846fa3e22f4fbd829e42582d6a9
|
||||
timeCreated: 1425647029
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in New Issue
Block a user