-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMovingPlatform.cs
More file actions
133 lines (118 loc) · 3.3 KB
/
MovingPlatform.cs
File metadata and controls
133 lines (118 loc) · 3.3 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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class MovingPlatform : MyNetworkBehaviour {
public List<Vector2> path;
public bool relativePath;
public int positionIndex;//first target
public enum MODES { linear, lerp, rotateContinual}
public MODES mode;
public float speed;
public float timeBetweenMovements;
private Vector2 startPos;
void Start()
{
startPos = transform.position;
if(isServer)
{
StartCoroutine(Run());
}
}
[ClientRpc]
void RpcRun()
{
if(isClientOnly)
StartCoroutine(Run());
}
[ClientRpc]
void RpcUpdatePosition(int newPositionIndex, Vector2 currentPos)
{
//called by server at the end of every cycle to ensure everyone is up to data
if(isClientOnly)
{
StopAllCoroutines();
transform.position = currentPos;
positionIndex = newPositionIndex;
StartCoroutine(Run());
}
}
IEnumerator Run()
{
//sync time
if(isServer)
{
yield return new WaitForSeconds(1);
RpcRun();
}
if(mode == MODES.rotateContinual)
{
yield return new WaitForSeconds(timeBetweenMovements);
yield return RotateForever();
}
else if(mode == MODES.linear)
{
while(true)
{
Vector2 target = path[positionIndex];
if(relativePath)
target += startPos;
yield return LinearTo(target);
yield return new WaitForSeconds(timeBetweenMovements);
positionIndex = (positionIndex + 1) % path.Count;
if(isServer)
RpcUpdatePosition(positionIndex, transform.position);
}
}
else if(mode == MODES.lerp)
{
while(true)
{
Vector2 target = path[positionIndex];
if(relativePath)
target += startPos;
yield return LerpTo(target);
yield return new WaitForSeconds(timeBetweenMovements);
positionIndex = (positionIndex + 1) % path.Count;
}
}
}
IEnumerator LinearTo(Vector2 target)
{
while(true)
{
Vector2 dir = target - (Vector2) transform.position;
if(dir.magnitude < speed)
{
transform.position = target;
yield break;
}
dir.Normalize();
dir *= speed;
transform.position += (Vector3) dir;
yield return null;
}
}
IEnumerator LerpTo(Vector2 target)
{
while(true)
{
Vector2 dir = target - (Vector2)transform.position;
if(dir.magnitude < 0.1f)
{
transform.position = target;
yield break;
}
transform.position = Vector2.Lerp(transform.position, target, speed);
yield return null;
}
}
IEnumerator RotateForever()
{
while(true)
{
transform.Rotate(new Vector3(0, 0, speed));
yield return null;
}
}
}