-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathObjectConections.cs
More file actions
154 lines (122 loc) · 4.78 KB
/
ObjectConections.cs
File metadata and controls
154 lines (122 loc) · 4.78 KB
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Events;
using UnityEngine;
public sealed class ObjectConections : MonoBehaviour
{
[Header("Refrences")]
[SerializeField] private ParticleSystem attachPartsParticle;
[SerializeField] private AudioSource audioSource;
[SerializeField] private AudioClip attachSound;
[SerializeField] private AudioClip deattachSound;
[Space]
[SerializeField] private List<GameObject> connectionPoints;
[Header("Events")]
[SerializeField] private UnityEvent onConnect;
[SerializeField] private UnityEvent onDetach;
private ItemManager _itemManager;
private Vector3 _connectionPos;
private bool _canConnect = true;
private bool _isConnected;
private float _closestDistance = 99f;
private const float CanConnectAgainTimer = 0.5f;
private void Start()
{
_itemManager = FindObjectOfType<ItemManager>();
var points = gameObject.GetComponentsInChildren<ConnectionPoint>();
foreach (var connectionPoint in points)
{
connectionPoints.Add(connectionPoint.gameObject);
}
}
public void SetObjectConnection()
{
var closestItem = GetClosestObject();
if (closestItem == null) return;
var closestConnection = GetClosestJoint(closestItem);
if (closestConnection != null
&& Vector3.Distance(closestConnection[0].transform.position, closestConnection[1].transform.position) < 1
&& _canConnect)
{
SetObjectPosition(closestConnection);
}
}
public void RemoveConnectedItems()
{
if(gameObject.transform.childCount == 0) return;
gameObject.transform.SetParent(null, true);
StartCoroutine(Timer());
if (!_isConnected) return;
_isConnected = false;
onDetach?.Invoke();
}
public void ActivateParticleSystem()
{
var particleSystemObject = Instantiate(attachPartsParticle);
particleSystemObject.transform.position = _connectionPos;
}
public void MakeSound(bool isAttaching)
{
var currentSound = isAttaching ? attachSound : deattachSound;
audioSource.clip = currentSound;
audioSource.Play();
}
private GameObject GetClosestObject()
{
var items = _itemManager.GetItems();
if (items.Count == 0) return null;
GameObject closestObject = null;
foreach (var obj in items)
{
if (obj == gameObject) continue;
var currentDistance = Vector3.Distance(gameObject.transform.position, obj.transform.position);
if (!(currentDistance < _closestDistance)) continue;
_closestDistance = currentDistance;
closestObject = obj;
}
return closestObject;
}
private List<GameObject> GetClosestJoint(GameObject Item)
{
var targetPoints = new List<GameObject>();
GameObject closestConnection = null;
GameObject closestConnectionSelf = null;
var otherConnectionPoints = Item.GetComponentsInChildren<ConnectionPoint>();
foreach (var otherPoint in otherConnectionPoints)
{
foreach (var point in connectionPoints)
{
var distanceJoints = Vector3.Distance(point.gameObject.transform.position, otherPoint.transform.position);
if(distanceJoints >= _closestDistance
&& point.gameObject.transform.localPosition.y - otherPoint.transform.localPosition.y == 0) continue;
_closestDistance = distanceJoints;
closestConnection = otherPoint.gameObject;
closestConnectionSelf = point.gameObject;
}
}
targetPoints.Add(closestConnection);
targetPoints.Add(closestConnectionSelf);
return targetPoints;
}
private void SetObjectPosition(IReadOnlyList<GameObject> closestConnection)
{
var finalPos = closestConnection[0].transform.position;
var offset = gameObject.transform.position - closestConnection[1].transform.position;
_connectionPos = closestConnection[1].transform.position;
gameObject.transform.position = finalPos + offset;
AddConnectedItem(closestConnection[0]);
}
private void AddConnectedItem(GameObject targetConnection)
{
gameObject.transform.SetParent(targetConnection.transform.parent.FindChild("AtachmentPoint"));
if (_isConnected) return;
_isConnected = true;
onConnect?.Invoke();
}
private IEnumerator Timer()
{
_canConnect = false;
yield return new WaitForSeconds(CanConnectAgainTimer);
_canConnect = true;
}
}