diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 8617d6e..b18fb03 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -561,11 +561,13 @@ MonoBehaviour: m_EditorClassIdentifier: boidTemplate: {fileID: 4213572534340104675, guid: 890f3224580083e43a66e32b71b03aa3, type: 3} - boidNum: 10 - boidCenterInfluence: 0.409 - boidBoidInfluence: 0.5 - boidSpeed: 31.3 - boidCorneringSpeed: 0.0132 + boidNum: 50 + boidVisionCone: 180 + boidCenterInfluence: 1.15 + boidAvoidInfluence: 6.8 + boidAlignInfluence: 100 + boidSpeed: 25 + boidCorneringSpeed: 0.458 center: {x: 0, y: 0, z: 0} --- !u!4 &1744584615 Transform: @@ -575,7 +577,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1744584613} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1.6519947, y: 1.5839331, z: 0.49270648} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} diff --git a/Assets/Scripts/BoidComponent.cs b/Assets/Scripts/BoidComponent.cs index f6dfeaa..14137ca 100644 --- a/Assets/Scripts/BoidComponent.cs +++ b/Assets/Scripts/BoidComponent.cs @@ -1,52 +1,54 @@ -using System; -using System.Collections; -using System.Collections.Generic; +using System.Collections.Generic; using UnityEngine; public class BoidComponent : MonoBehaviour { private float centerInfluence; - private float boidInfluence = 0.5f; - private float speed = 50; - private float corneringSpeed = 0.001f; + private float avoidInfluence; + private float alignInfluence; + private float speed; + private float corneringSpeed; private Vector3 closestCenter; [SerializeField] public float visionConeAngle; [SerializeField] public float movementConeAngle; List collisions; - // Start is called before the first frame update - void Start() + + void Awake() { collisions = new List(); } - - void FixedUpdate() - { - Move(); - //Debug.DrawLine(transform.position, transform.forward + transform.position); - } - public void setCenterInfluence(float centerInfluence) { this.centerInfluence = centerInfluence; } + public void setAvoidInfluence(float avoidInfluence) + { + this.avoidInfluence = avoidInfluence; + } + + public void setAlignInfluence(float alignInfluence) + { + this.alignInfluence = alignInfluence; + } + public void setSpeed(float boidSpeed) { speed = boidSpeed; } + public void setVisionConeAngle(float visionConeAngle) + { + this.visionConeAngle = visionConeAngle; + } + public void setCorneringSpeed(float corneringSpeed) { this.corneringSpeed = corneringSpeed; } - private void OnTriggerEnter(Collider collision) - { - - } - private void OnTriggerStay(Collider collision) { if (!collisions.Contains(collision)) @@ -62,7 +64,7 @@ public class BoidComponent : MonoBehaviour public void Move() { - Vector3 targetDir = -(calcCloseBoidInteractionsV3() * boidInfluence); + Vector3 targetDir = -(calcCloseBoidInteractionsV3()); //Debug.Log(targetDir); if(!targetDir.Equals(transform.forward)) @@ -74,11 +76,13 @@ public class BoidComponent : MonoBehaviour targetDir = calcCenterInfluenceV3(closestCenter) * centerInfluence; } + Debug.DrawLine(transform.position, transform.position + targetDir, Color.magenta); + Quaternion directionRotation = Quaternion.LookRotation(-targetDir); transform.rotation = Quaternion.Slerp(transform.rotation, directionRotation, corneringSpeed * Time.deltaTime); - transform.position += transform.forward * (1/(101 - speed * Time.deltaTime)); + transform.position += transform.forward * (speed * Time.deltaTime); } private Vector3 calcCloseBoidInteractionsV3() @@ -114,9 +118,11 @@ public class BoidComponent : MonoBehaviour if (angleBetweenObjects < visionConeAngle) { //align - if(obstacle.layer == 0 && obstacle.tag == "boid") + if(obstacle.layer == 0 ) { - desiredDirectionToLook += (obstacle.transform.forward); + //Debug.Log("HERE"); + desiredDirectionToLook += (obstacle.transform.forward * alignInfluence); + Debug.DrawLine(transform.position, transform.position + obstacle.transform.forward, Color.green); } //Find angle between forward vectors @@ -128,23 +134,24 @@ public class BoidComponent : MonoBehaviour angleBetweenForwards = Mathf.Rad2Deg * Mathf.Acos(angleBetweenObjects / (transform.forward.magnitude * contact.magnitude)); }*/ - if (collision.gameObject.layer == 0 && angleBetweenObjects < movementConeAngle) + if (collision.gameObject.layer == 0 && angleBetweenObjects < 180 - movementConeAngle) { - //Debug.Log(dist); + //Debug.Log(angleBetweenObjects); //avoid /* Vector3 avoid = new Vector3(); avoid.x = targetDir.x * (1 / dist); avoid.y = targetDir.y * (1 / dist); avoid.z = targetDir.z * (1 / dist); - - Debug.DrawLine(transform.position, -targetDir); */ + //Debug.DrawLine(transform.position, -targetDir); + + Vector3 avoid = (-targetDir.normalized * 5) / (dist); - desiredDirectionToLook += avoid; - //Debug.DrawLine(transform.position, transform.position + avoid); + desiredDirectionToLook += (avoid * Mathf.Pow(avoidInfluence, 3)); + Debug.DrawLine(transform.position, transform.position + (avoid * Mathf.Pow(avoidInfluence, 3)), Color.blue); //Debug.Log(avoid.magnitude); } } @@ -168,66 +175,11 @@ public class BoidComponent : MonoBehaviour return desiredDirectionToLook.normalized; } - private Quaternion calcCloseBoidInteractions() - { - Quaternion rotation = Quaternion.identity; - - foreach (Collider collision in collisions) - { - //Find angle between objects - Vector3 targetDir = collision.gameObject.transform.position - transform.position; - - float angleBetweenObjects = Vector3.Angle(targetDir, transform.forward); - - if (angleBetweenObjects < 180 - visionConeAngle) - { - //Debug.Log(angleBetweenObjects); - //Find angle between forward vectors - Vector3 contact = collision.gameObject.transform.forward; - float angleBetweenForwards = Vector3.Dot(transform.forward, contact); - - if (angleBetweenForwards != 0) - { - angleBetweenForwards = Mathf.Rad2Deg * Mathf.Acos(angleBetweenObjects / (transform.forward.magnitude * contact.magnitude)); - } - - - //align - - - Quaternion temp = Quaternion.LookRotation((collision.gameObject.transform.forward)/2); - //Debug.Log("T: " + collision.gameObject.transform.forward + " B: " + transform.forward); - - - rotation *= Quaternion.Slerp(transform.rotation, temp, boidInfluence); - - if(collision.gameObject.layer == 0 && angleBetweenObjects < 180 - movementConeAngle) - { - //Debug.Log(angleBetweenObjects); - } - } - } - if(rotation.Equals(Quaternion.identity)) - { - return transform.rotation; - } - return rotation; - } + private Vector3 calcCenterInfluenceV3(Vector3 center) { //Debug.DrawLine(transform.position, center); return (transform.position - center).normalized; } - - private Quaternion calcCenterInfluence(Vector3 center) - { - Vector3 newDirection = (transform.position - center).normalized; - - Quaternion directionRotation = Quaternion.LookRotation(newDirection); - - return Quaternion.Slerp(transform.rotation, directionRotation, centerInfluence); - - //return -(newDirection * centerInfluence); - } } diff --git a/Assets/Scripts/BoidManager.cs b/Assets/Scripts/BoidManager.cs index 06a29fe..d478213 100644 --- a/Assets/Scripts/BoidManager.cs +++ b/Assets/Scripts/BoidManager.cs @@ -6,30 +6,41 @@ public class BoidManager : MonoBehaviour { [SerializeField] public BoidComponent boidTemplate; [SerializeField] public int boidNum; - [SerializeField] [Range(0.0001f, 1)] public float boidCenterInfluence = 0.5f; - [SerializeField][Range(0.0001f, 1)] public float boidBoidInfluence = 0.5f; - [SerializeField][Range(1, 100)] public float boidSpeed = 1; + [SerializeField][Range(1, 180)] public float boidVisionCone; + [SerializeField] [Range(0.0001f, 100)] public float boidCenterInfluence = 0.5f; + [SerializeField][Range(0.0001f, 100)] public float boidAvoidInfluence = 0.5f; + [SerializeField][Range(0.0001f, 100)] public float boidAlignInfluence = 0.5f; + [SerializeField][Range(1, 500)] public float boidSpeed = 1; [SerializeField][Range(0.0001f, 1f)] public float boidCorneringSpeed = 0.5f; private float setSpeed; + private float setVisionConeAngle; private float setCenterInfluence; - private float setBoidInfluence; + private float setAvoidInfluence; + private float setAlignInfluence; private float setCornering; private List boids = new List(); public Vector3 center; + // Start is called before the first frame update void Start() { setSpeed = boidSpeed; + setVisionConeAngle = boidVisionCone; setCornering = boidCorneringSpeed; setCenterInfluence = boidCenterInfluence; - setBoidInfluence = boidBoidInfluence; + setAlignInfluence = boidAlignInfluence; + setAvoidInfluence = boidAvoidInfluence; for(int i = 0; i < boidNum; i++) { BoidComponent tempBoid = BoidComponent.Instantiate(boidTemplate); tempBoid.setCenterInfluence(boidCenterInfluence); - tempBoid.setSpeed(boidSpeed); + tempBoid.setVisionConeAngle(boidVisionCone); + tempBoid.setSpeed(boidSpeed); + tempBoid.setAvoidInfluence(boidAvoidInfluence); + tempBoid.setAlignInfluence(boidAlignInfluence); + tempBoid.setCorneringSpeed(boidCorneringSpeed); tempBoid.transform.position = new Vector3( Random.Range(0f, 100f), Random.Range(0f, 100f), Random.Range(0f, 100f)); boids.Add(tempBoid); @@ -44,19 +55,25 @@ public class BoidManager : MonoBehaviour boid.Move(); } - if (boidSpeed != setSpeed || boidCenterInfluence != setCenterInfluence || - boidBoidInfluence != setBoidInfluence || boidCorneringSpeed != setCornering) + if (boidSpeed != setSpeed || setVisionConeAngle != boidVisionCone || boidCenterInfluence != setCenterInfluence || + setAlignInfluence != boidAlignInfluence || setAvoidInfluence != boidAvoidInfluence|| boidCorneringSpeed != setCornering) { foreach (BoidComponent boid in boids) { boid.setSpeed(boidSpeed); + boid.setVisionConeAngle(boidVisionCone); + boid.setCorneringSpeed(boidCorneringSpeed); boid.setCenterInfluence(boidCenterInfluence); boid.setCorneringSpeed(boidCorneringSpeed); + boid.setAvoidInfluence(boidAvoidInfluence); + boid.setAlignInfluence(boidAlignInfluence); } setSpeed = boidSpeed; setCenterInfluence = boidCenterInfluence; - setCornering = boidCorneringSpeed; + setCornering = boidCorneringSpeed; + setAvoidInfluence = boidAvoidInfluence; + setAlignInfluence = boidAlignInfluence; } }