-
Notifications
You must be signed in to change notification settings - Fork 23
/
FlockObjectBehaviour.cs
90 lines (70 loc) · 1.96 KB
/
FlockObjectBehaviour.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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FlockObjectBehaviour : MonoBehaviour {
float speed = 0.5f;
float rotationSpeed = 4.0f;
Vector3 averageHeading;
Vector3 averagePosition;
float neighbourDist = 2f;
FlockManager manager;
void Start()
{
speed = Random.Range (speed, 3 * speed);
if (GetComponent<Animator> () != null) {
GetComponent<Animator> ().enabled = false;
//GetComponent<Animator> ().SetBool ("wait", true);
Invoke ("StartAnim", Random.Range (0.1f, 1f));
}
}
void StartAnim()
{
GetComponent<Animator> ().enabled=true;
}
public void SetManager(FlockManager mgr)
{
manager = mgr;
neighbourDist = mgr.neighbourRadius;
speed = mgr.objSpeed;
rotationSpeed = mgr.objRotSpeed;
}
void Update()
{
if(Random.Range(0,5) < 1)
Check();
transform.Translate(new Vector3(0,0,Time.deltaTime * speed));
}
void Check ()
{
GameObject[] gos = FlockManager.objs.ToArray ();
Vector3 vCenter = Vector3.zero;
Vector3 vAvoid = Vector3.zero;
float gSpeed = 0.1f;
Vector3 goalPos = manager.goalPos;
float dist;
int groupSize = 0;
foreach (GameObject g in gos) {
if (g != this.gameObject) {
dist = Vector3.Distance (g.transform.position, this.transform.position);
if (dist <= neighbourDist) {
vCenter += g.transform.position;
groupSize++;
if (dist < 1f) {
vAvoid += this.transform.position - g.transform.position;
}
gSpeed += g.GetComponent<FlockObjectBehaviour> ().speed;
}
}
}
if (groupSize > 0) {
vCenter = vCenter / groupSize + (goalPos - this.transform.position);
speed = gSpeed / groupSize;
Vector3 dir = (vCenter + vAvoid) - transform.position;
if (dir != Vector3.zero)
transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation (dir), rotationSpeed * Time.deltaTime);
}
if ((goalPos - this.transform.position).sqrMagnitude < 2f)
manager.NextTarget ();
SetManager (manager);
}
}