-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTile.cs
98 lines (81 loc) · 3.24 KB
/
Tile.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
namespace RLO.Science.BasicsOfProgramming
{
public class Tile : SerializedMonoBehaviour
{
public Dictionary<DIR, Tile> Links;
public Vector3 BotPos;
[SerializeField] private MeshFilter _mFilter;
[SerializeField] private MeshRenderer _mRenderer;
[SerializeField] private Color _visitColor = Color.green;
private Color defColor = Color.white;
private bool _botPresent;
void Start()
{
defColor = _mRenderer.materials[1].color;
}
public void OnBotVisit()
{
_mRenderer.materials[1].color = _visitColor;
}
public void OnBotLeave()
{
_mRenderer.materials[1].color = defColor;
}
public void DetectNeighbours()
{
Links = new Dictionary<DIR, Tile>
{
{DIR.North, null},
{DIR.South, null},
{DIR.East, null},
{DIR.West, null}
};
var origin = transform.position;
var n = new Ray(origin, Vector3.forward);
var s = new Ray(origin, -Vector3.forward);
var w = new Ray(origin, Vector3.left);
var e = new Ray(origin, Vector3.right);
Physics.Raycast(n, out var nHit, 1.0f);
Physics.Raycast(s, out var sHit, 1.0f);
Physics.Raycast(w, out var wHit, 1.0f);
Physics.Raycast(e, out var eHit, 1.0f);
if (nHit.transform != null)
Links[DIR.North] = nHit.transform.gameObject.GetComponent<Tile>();
if (sHit.transform != null)
Links[DIR.South] = sHit.transform.gameObject.GetComponent<Tile>();
if (eHit.transform != null)
Links[DIR.East] = eHit.transform.gameObject.GetComponent<Tile>();
if (wHit.transform != null)
Links[DIR.West] = wHit.transform.gameObject.GetComponent<Tile>();
}
private void OnDrawGizmos()
{
Gizmos.color = Color.cyan;
Gizmos.DrawCube(BotPos, Vector3.one/10);
var x = Vector3.up / 3;
if (Links[DIR.North]) Gizmos.DrawLine(transform.position + x, Links[DIR.North].transform.position + x);
if (Links[DIR.South]) Gizmos.DrawLine(transform.position + x, Links[DIR.South].transform.position + x);
if (Links[DIR.East]) Gizmos.DrawLine(transform.position + x, Links[DIR.East].transform.position + x);
if (Links[DIR.West]) Gizmos.DrawLine(transform.position + x, Links[DIR.West].transform.position + x);
}
private void SetBotPos()
{
var size = _mFilter.sharedMesh.bounds.size;
var pos = transform.position;
var scale = transform.localScale.x;
pos.y = size.z / 2 * scale + pos.y; // we're using size.z due to model rotation.
BotPos = pos;
}
void Reset()
{
DetectNeighbours();
_mFilter = GetComponent<MeshFilter>();
_mRenderer = GetComponent<MeshRenderer>();
SetBotPos();
}
}
public enum DIR { North, South, East, West}
}