diff --git a/src/Scripts/Agent.cs b/src/Scripts/Agent.cs index f77a515c831bcbae0bfc27669329eff85c3376ac..241c4b56b0247fd7d74f49c90a280ca21a405650 100755 --- a/src/Scripts/Agent.cs +++ b/src/Scripts/Agent.cs @@ -20,14 +20,13 @@ public class Agent : MonoBehaviour, Visible void Start() { system = GameObject.Find("SMA").GetComponent<SMA>(); - comportement = new Reynolds(this); - perception = new Perception360(this, 15); - //perception = new Perception(this,20.0f,180.0f); - direction = Utils.randomDirection(); - //speed = UnityEngine.Random.Range(0.8f,1.2f); + //comportement = new Reynolds(this); + List<Comportement> c = new List<Comportement> { new Reynolds(this), new Bord(this)}; + comportement = new CompositeSeq(this,c); + perception = new Perception180(this,20.0f); + direction = Vector3.zero; speed = 0.7f; oldDirections = new List<Vector3>(); - oldDirections.Add(direction); } // Update is called once per frame diff --git a/src/Scripts/Comportement/Aleatoire.cs b/src/Scripts/Comportement/Aleatoire.cs index aa349820c13862a26b36347fbb9b0456baf01c53..782a799b7b242f22e71d63f7e5da2d2e1a14dda5 100755 --- a/src/Scripts/Comportement/Aleatoire.cs +++ b/src/Scripts/Comportement/Aleatoire.cs @@ -8,8 +8,7 @@ public class Aleatoire : Comportement public Aleatoire(Agent proprietaire) : base(proprietaire) {} public override Vector3 reagir(List<Observation> observation) { - //int bruit = UnityEngine.Random.Range(1,5); - return proprietaire.oldDirections[0].normalized; + return Utils.randomDirection(); } } diff --git a/src/Scripts/Comportement/Bord.cs b/src/Scripts/Comportement/Bord.cs new file mode 100755 index 0000000000000000000000000000000000000000..211ab3b1eeb4fe9560e0c65190889dd320283f0d --- /dev/null +++ b/src/Scripts/Comportement/Bord.cs @@ -0,0 +1,40 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Bord : Comportement +{ + static public float Urgent = 3.0f; + static public float Preoccuppant = 5.0f; + static public float Intrigant = 8.0f; + + public Bord(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + List<Vector3> vectors = new List<Vector3>(); + vectors.Add(proprietaire.direction); + foreach(Observation o in observation) { + if (!o.objet.isAlive()) { + if(grandDanger(o)) for(int i=0;i<3;i++) vectors.Add(fuir(o.distance)); + else if(moyenDanger(o)) for(int i=0;i<2;i++) vectors.Add(fuir(o.distance)); + else if(petitDanger(o)) vectors.Add(fuir(o.distance)); + } + } + Vector3 res = Utils.meanVector(vectors); + return Utils.noiseVector(res,nbBruit,bruit); + } + + private bool grandDanger(Observation o) { + return (Utils.normVector(o.distance) < Urgent); + } + + private bool moyenDanger(Observation o) { + return (Utils.normVector(o.distance) < Preoccuppant); + } + + private bool petitDanger(Observation o) { + return (Utils.normVector(o.distance) < Intrigant); + } + + private Vector3 fuir(Vector3 d) { return -d.normalized; } +} diff --git a/src/Scripts/Comportement/Comportement.cs b/src/Scripts/Comportement/Comportement.cs index c1728d8de44448aabffc1667c2a49e8d68990c43..580374ab2217376be885958fe92b57e2b5001c4a 100755 --- a/src/Scripts/Comportement/Comportement.cs +++ b/src/Scripts/Comportement/Comportement.cs @@ -7,17 +7,13 @@ public abstract class Comportement protected Agent proprietaire; - protected int nbBruit = 5; - protected float bruit = 0.01f; + protected int nbBruit = 8; + protected float bruit = 0.05f; public Comportement(Agent a) { proprietaire = a; } public abstract Vector3 reagir(List<Observation> observation) ; - /*{ - return Utils.noiseVector(proprietaire.direction,nbBruit,bruit); - //return Vector3.zero; - }*/ } diff --git a/src/Scripts/Comportement/CompositeSeq.cs b/src/Scripts/Comportement/CompositeSeq.cs new file mode 100755 index 0000000000000000000000000000000000000000..4138ade06a8b750dfafa0392f39f0f1236853a80 --- /dev/null +++ b/src/Scripts/Comportement/CompositeSeq.cs @@ -0,0 +1,33 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class CompositeSeq : Comportement +{ + + protected List<Comportement> comportements; + + public CompositeSeq(Agent proprietaire,List<Comportement> c) : base(proprietaire) { + comportements = c; + } + + public CompositeSeq(Agent proprietaire) : base(proprietaire) { + comportements = new List<Comportement>(); + } + + public void removeComportement(int i) { comportements.RemoveAt(i); } + + public void AddComportement(Comportement c) { comportements.Add(c); } + + public override Vector3 reagir(List<Observation> observation) { + List<Vector3> vectors = new List<Vector3>(); + vectors.Add(proprietaire.direction); + Vector3 add; + for(int i=0;i<comportements.Count;i++) { + add = comportements[i].reagir(observation); + vectors.Add(add); + } + return Utils.meanVector(vectors); + } + +} diff --git a/src/Scripts/Comportement/Paper.cs b/src/Scripts/Comportement/Paper.cs new file mode 100755 index 0000000000000000000000000000000000000000..93a675b61060b3ae9f2a98b564ad1fbf002317a3 --- /dev/null +++ b/src/Scripts/Comportement/Paper.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Paper : Comportement +{ + public Paper(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + return Utils.randomDirection(); + } + +} diff --git a/src/Scripts/Comportement/Player.cs b/src/Scripts/Comportement/Player.cs new file mode 100755 index 0000000000000000000000000000000000000000..6e16e35097d8eba081cd6cf2523774406aab1425 --- /dev/null +++ b/src/Scripts/Comportement/Player.cs @@ -0,0 +1,12 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Player : Comportement +{ + public Player(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + return Utils.randomDirection(); + } +} diff --git a/src/Scripts/Comportement/Predator.cs b/src/Scripts/Comportement/Predator.cs new file mode 100755 index 0000000000000000000000000000000000000000..600118f2a2c536ad872827afa8dee1cf8c59d527 --- /dev/null +++ b/src/Scripts/Comportement/Predator.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Predator : Comportement +{ + public Predator(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + return Utils.randomDirection(); + } + +} diff --git a/src/Scripts/Comportement/Prey.cs b/src/Scripts/Comportement/Prey.cs new file mode 100755 index 0000000000000000000000000000000000000000..e2eee6545925ecead972d720e4b8a1fdbfeeb8e7 --- /dev/null +++ b/src/Scripts/Comportement/Prey.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Prey : Comportement +{ + public Prey(Agent proprietaire) : base(proprietaire) {} + + public override Vector3 reagir(List<Observation> observation) { + return Utils.randomDirection(); + } + +} diff --git a/src/Scripts/Comportement/Reynolds.cs b/src/Scripts/Comportement/Reynolds.cs index f5fac296e83a3cb7e59073b72129ef1e4a1750f3..ddb7a7b355715ef48315996edf9539ba7ad2a23b 100755 --- a/src/Scripts/Comportement/Reynolds.cs +++ b/src/Scripts/Comportement/Reynolds.cs @@ -20,12 +20,8 @@ public class Reynolds : Comportement else if(normal(o)) vectors.Add(suivre(o.objet)); else if(isolement(o)) vectors.Add(rapprocher(o.distance)); } - else { - if(danger(o)) for(int i=0;i<5;i++) vectors.Add(fuir(o.distance)); - } } Vector3 res = Utils.meanVector(vectors); - //return proprietaire.direction; return Utils.noiseVector(res,nbBruit,bruit); } @@ -33,7 +29,7 @@ public class Reynolds : Comportement return (Utils.normVector(o.distance) < Escape); } - private Vector3 fuir(Vector3 d) { return -d; } + private Vector3 fuir(Vector3 d) { return -d.normalized; } private bool normal(Observation o) { return Utils.normVector(o.distance) < Together; @@ -41,13 +37,13 @@ public class Reynolds : Comportement private Vector3 suivre(Visible a) { Agent agent = (Agent) a; - return agent.direction; + return agent.direction.normalized; } private bool isolement(Observation o) { return Utils.normVector(o.distance) <= Follow; } - private Vector3 rapprocher(Vector3 d) { return d; } + private Vector3 rapprocher(Vector3 d) { return d.normalized; } } diff --git a/src/Scripts/Environnement/Cube.cs b/src/Scripts/Environnement/Cube.cs new file mode 100755 index 0000000000000000000000000000000000000000..20916b19d709b3156dae9eaf546ae8e8bb5e9774 --- /dev/null +++ b/src/Scripts/Environnement/Cube.cs @@ -0,0 +1,53 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Cube : Topologie +{ + + public float minX; + public float maxX; + public float minY; + public float maxY; + public float minZ; + public float maxZ; + public GameObject cube; + + + public Cube(GameObject c) : base() { + cube = c; + float scaleX = cube.transform.localScale.x; + float scaleY = cube.transform.localScale.y; + float scaleZ = cube.transform.localScale.z; + minX = -scaleX/2.0f;maxX = scaleX/2.0f; + minY = -scaleY/2.0f;maxY = scaleY/2.0f; + minZ = -scaleZ/2.0f;maxZ = scaleZ/2.0f; + } + + public override GameObject getGameObject() { return cube;} + + public override Observation detectEnv(Agent current) { + Vector3 pos = current.transform.position; + List<Vector3> p = new List<Vector3> + { + new Vector3(minX,pos.y,pos.z), new Vector3(maxX,pos.y,pos.z), + new Vector3(pos.x,minY,pos.z), new Vector3(pos.x,maxY,pos.z), + new Vector3(pos.x,pos.y,minZ), new Vector3(pos.x,pos.y,maxZ), + }; + float dist = Utils.normVector(p[0] - pos); + float d; Vector3 res = p[0]; + for(int i=1;i<p.Count;i++) { + d = Utils.normVector(p[i] - pos); + if(d<dist) { + dist = d; + res = p[i]; + } + } + return new Observation(new Obstacle(res),res-pos); + } + + public override Vector3 validPosition() { + return Utils.randomVector(minX, maxX, minY, maxY, minZ, maxZ); + } + +} diff --git a/src/Scripts/Environnement/Environnement.cs b/src/Scripts/Environnement/Environnement.cs index e024985ce60a846a662c5fb933cc4b94bbda29ff..36ac2cd710e49fe390fbb5079f787b8aa0da0964 100755 --- a/src/Scripts/Environnement/Environnement.cs +++ b/src/Scripts/Environnement/Environnement.cs @@ -6,45 +6,17 @@ public class Environnement : MonoBehaviour { private SMA system; - public GameObject topologie; - public float minX; - public float maxX; - public float minY; - public float maxY; - public float minZ; - public float maxZ; + private Topologie topologie; + public GameObject cube; + private List<Obstacle> obstacles; // Start is called before the first frame update void Start() { system = GameObject.Find("SMA").GetComponent<SMA>(); - Instantiate(topologie, Vector3.zero, Quaternion.identity,transform); - float scaleX = topologie.transform.localScale.x; - float scaleY = topologie.transform.localScale.y; - float scaleZ = topologie.transform.localScale.z; - minX = -scaleX/2.0f;maxX = scaleX/2.0f; - minY = -scaleY/2.0f;maxY = scaleY/2.0f; - minZ = -scaleZ/2.0f;maxZ = scaleZ/2.0f; - } - - public Observation detectEnv(Agent current) { - Vector3 pos = current.transform.position; - List<Vector3> p = new List<Vector3> - { - new Vector3(minX,pos.y,pos.z), new Vector3(maxX,pos.y,pos.z), - new Vector3(pos.x,minY,pos.z), new Vector3(pos.x,maxY,pos.z), - new Vector3(pos.x,pos.y,minZ), new Vector3(pos.x,pos.y,maxZ), - }; - float dist = Utils.normVector(p[0] - pos); - float d; Vector3 res = p[0]; - for(int i=1;i<p.Count;i++) { - d = Utils.normVector(p[i] - pos); - if(d<dist) { - dist = d; - res = p[i]; - } - } - return new Observation(new Obstacle(res),res-pos); + obstacles = new List<Obstacle>(); + topologie = new Cube(cube); + Instantiate(topologie.getGameObject(), Vector3.zero, Quaternion.identity,transform); } public List<Observation> voisinage(Agent current, float rayon, float angle) { @@ -56,12 +28,16 @@ public class Environnement : MonoBehaviour a = Vector3.Angle(current.direction,dist); if (system.agents[i] != current && l <= rayon && a <= angle/2.0f) res.Add(new Observation(system.agents[i],dist)); } - Observation bord = detectEnv(current); + Observation bord = topologie.detectEnv(current); l = Utils.normVector(bord.distance); a = Vector3.Angle(current.direction,bord.distance); if(l <= rayon && a <= angle/2.0f) res.Add(bord); return res; } + public Vector3 validPosition() { + return topologie.validPosition(); + } + // Update is called once per frame void Update() { diff --git a/src/Scripts/Environnement/Topologie.cs b/src/Scripts/Environnement/Topologie.cs new file mode 100755 index 0000000000000000000000000000000000000000..7ad7de27e20dc077ce1ed666654d726d7c4b9f51 --- /dev/null +++ b/src/Scripts/Environnement/Topologie.cs @@ -0,0 +1,16 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public abstract class Topologie +{ + + public Topologie() {} + + public abstract GameObject getGameObject(); + + public abstract Observation detectEnv(Agent current); + + public abstract Vector3 validPosition(); + +} diff --git a/src/Scripts/Perception/Perception.cs b/src/Scripts/Perception/Perception.cs index 0cf080e1deb9b0ba1a22002974448aa4bf951d19..ce872e4552476670f39925c158d600dc0bf1a111 100755 --- a/src/Scripts/Perception/Perception.cs +++ b/src/Scripts/Perception/Perception.cs @@ -19,15 +19,4 @@ public class Perception return proprietaire.system.environnement.voisinage(proprietaire, rayon, angle); } - // Start is called before the first frame update - void Start() - { - - } - - // Update is called once per frame - void Update() - { - - } } diff --git a/src/Scripts/Perception/Perception180.cs b/src/Scripts/Perception/Perception180.cs new file mode 100755 index 0000000000000000000000000000000000000000..8d77ca26229311bc6c6ec90b3b96a1cf062748e0 --- /dev/null +++ b/src/Scripts/Perception/Perception180.cs @@ -0,0 +1,8 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Perception180 : Perception +{ + public Perception180(Agent agent, float r) : base(agent, r, 180.0f) {} +} diff --git a/src/Scripts/Perception/Perception360.cs b/src/Scripts/Perception/Perception360.cs index d650015890a123ebbf261f2b1fd4c52cb4c36179..0c4878f7c70ff5fde5a33866f062cdb695d11193 100755 --- a/src/Scripts/Perception/Perception360.cs +++ b/src/Scripts/Perception/Perception360.cs @@ -7,15 +7,4 @@ public class Perception360 : Perception public Perception360(Agent agent, float r) : base(agent, r, 360.0f) {} - // Start is called before the first frame update - void Start() - { - - } - - // Update is called once per frame - void Update() - { - - } } diff --git a/src/Scripts/Perception/Perception90.cs b/src/Scripts/Perception/Perception90.cs new file mode 100755 index 0000000000000000000000000000000000000000..237e5ab0fae7e95e6a210290136068c097ec70c2 --- /dev/null +++ b/src/Scripts/Perception/Perception90.cs @@ -0,0 +1,8 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class Perception90 : Perception +{ + public Perception90(Agent agent, float r) : base(agent, r, 90.0f) {} +} diff --git a/src/Scripts/SMA.cs b/src/Scripts/SMA.cs index 98d32dba5256db550e5f8b03896ac0950c804e6c..810ea056e4785049c055d4fe388dcfc391c28c51 100755 --- a/src/Scripts/SMA.cs +++ b/src/Scripts/SMA.cs @@ -6,7 +6,7 @@ public class SMA : MonoBehaviour { public List<Agent> agents; public Environnement environnement; - public int population = 50; + public int population = 80; public GameObject boid; @@ -32,10 +32,7 @@ public class SMA : MonoBehaviour void createAgents() { GameObject a; for(int i=0; i<population; i++) { - a = Instantiate(boid, - Utils.randomVector(environnement.minX, environnement.maxX, - environnement.minY, environnement.maxY, - environnement.minZ, environnement.maxZ), Quaternion.identity,environnement.transform) as GameObject; + a = Instantiate(boid, environnement.validPosition(), Quaternion.identity,environnement.transform) as GameObject; agents.Add(a.GetComponent<Agent>()); } diff --git a/src/Scripts/Utils.cs b/src/Scripts/Utils.cs index 3efaabdb3c7421cc2379ea80abc66910d2200e85..461669f8f942d47fae8a7d67092c6e3b5ea5734b 100755 --- a/src/Scripts/Utils.cs +++ b/src/Scripts/Utils.cs @@ -80,26 +80,4 @@ public class Utils return normalizedVector(x,y,z); } - /* List<Component> neighbourhood() { - List<Component> neighbours = new List<Component>(); - float dist; - Vector3 link; - Agent bird; - for(int i=0; i<birds.Length; i++) { - bird = (Agent) birds[i]; - link = bird.transform.position - transform.position; - dist = (float) Math.Sqrt(Math.Pow(link.x,2) + Math.Pow(link.y,2) + Math.Pow(link.z,2)); - if(bird != this && dist < system.RaynoldFollowTresh) neighbours.Add(birds[i]); - } - return neighbours; - } - - void SMA() { - Vector3 res = Vector3.zero; - res += direction; - if(transform.position.x < system.minX || transform.position.x > system.maxX) res.x = -direction.x; - if(transform.position.y < system.minY || transform.position.y > system.maxY) res.y = -direction.y; - if(transform.position.z < system.minZ || transform.position.z > system.maxZ) res.z = -direction.z; - nextDirections.Add(res); - }*/ }