Finalizing tweaks to various settings and influence factors

This commit is contained in:
Alex Stewart
2024-10-28 21:59:43 -07:00
parent 945da5a634
commit ae1b78e2b9
3 changed files with 72 additions and 101 deletions
+8 -6
View File
@@ -561,11 +561,13 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
boidTemplate: {fileID: 4213572534340104675, guid: 890f3224580083e43a66e32b71b03aa3, boidTemplate: {fileID: 4213572534340104675, guid: 890f3224580083e43a66e32b71b03aa3,
type: 3} type: 3}
boidNum: 10 boidNum: 50
boidCenterInfluence: 0.409 boidVisionCone: 180
boidBoidInfluence: 0.5 boidCenterInfluence: 1.15
boidSpeed: 31.3 boidAvoidInfluence: 6.8
boidCorneringSpeed: 0.0132 boidAlignInfluence: 100
boidSpeed: 25
boidCorneringSpeed: 0.458
center: {x: 0, y: 0, z: 0} center: {x: 0, y: 0, z: 0}
--- !u!4 &1744584615 --- !u!4 &1744584615
Transform: Transform:
@@ -575,7 +577,7 @@ Transform:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1744584613} m_GameObject: {fileID: 1744584613}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 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_LocalScale: {x: 1, y: 1, z: 1}
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
+38 -86
View File
@@ -1,52 +1,54 @@
using System; using System.Collections.Generic;
using System.Collections;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
public class BoidComponent : MonoBehaviour public class BoidComponent : MonoBehaviour
{ {
private float centerInfluence; private float centerInfluence;
private float boidInfluence = 0.5f; private float avoidInfluence;
private float speed = 50; private float alignInfluence;
private float corneringSpeed = 0.001f; private float speed;
private float corneringSpeed;
private Vector3 closestCenter; private Vector3 closestCenter;
[SerializeField] public float visionConeAngle; [SerializeField] public float visionConeAngle;
[SerializeField] public float movementConeAngle; [SerializeField] public float movementConeAngle;
List <Collider> collisions; List <Collider> collisions;
// Start is called before the first frame update
void Start() void Awake()
{ {
collisions = new List<Collider>(); collisions = new List<Collider>();
} }
void FixedUpdate()
{
Move();
//Debug.DrawLine(transform.position, transform.forward + transform.position);
}
public void setCenterInfluence(float centerInfluence) public void setCenterInfluence(float centerInfluence)
{ {
this.centerInfluence = 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) public void setSpeed(float boidSpeed)
{ {
speed = boidSpeed; speed = boidSpeed;
} }
public void setVisionConeAngle(float visionConeAngle)
{
this.visionConeAngle = visionConeAngle;
}
public void setCorneringSpeed(float corneringSpeed) public void setCorneringSpeed(float corneringSpeed)
{ {
this.corneringSpeed = corneringSpeed; this.corneringSpeed = corneringSpeed;
} }
private void OnTriggerEnter(Collider collision)
{
}
private void OnTriggerStay(Collider collision) private void OnTriggerStay(Collider collision)
{ {
if (!collisions.Contains(collision)) if (!collisions.Contains(collision))
@@ -62,7 +64,7 @@ public class BoidComponent : MonoBehaviour
public void Move() public void Move()
{ {
Vector3 targetDir = -(calcCloseBoidInteractionsV3() * boidInfluence); Vector3 targetDir = -(calcCloseBoidInteractionsV3());
//Debug.Log(targetDir); //Debug.Log(targetDir);
if(!targetDir.Equals(transform.forward)) if(!targetDir.Equals(transform.forward))
@@ -74,11 +76,13 @@ public class BoidComponent : MonoBehaviour
targetDir = calcCenterInfluenceV3(closestCenter) * centerInfluence; targetDir = calcCenterInfluenceV3(closestCenter) * centerInfluence;
} }
Debug.DrawLine(transform.position, transform.position + targetDir, Color.magenta);
Quaternion directionRotation = Quaternion.LookRotation(-targetDir); Quaternion directionRotation = Quaternion.LookRotation(-targetDir);
transform.rotation = Quaternion.Slerp(transform.rotation, directionRotation, corneringSpeed * Time.deltaTime); 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() private Vector3 calcCloseBoidInteractionsV3()
@@ -114,9 +118,11 @@ public class BoidComponent : MonoBehaviour
if (angleBetweenObjects < visionConeAngle) if (angleBetweenObjects < visionConeAngle)
{ {
//align //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 //Find angle between forward vectors
@@ -128,23 +134,24 @@ public class BoidComponent : MonoBehaviour
angleBetweenForwards = Mathf.Rad2Deg * Mathf.Acos(angleBetweenObjects / (transform.forward.magnitude * contact.magnitude)); 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 //avoid
/* /*
Vector3 avoid = new Vector3(); Vector3 avoid = new Vector3();
avoid.x = targetDir.x * (1 / dist); avoid.x = targetDir.x * (1 / dist);
avoid.y = targetDir.y * (1 / dist); avoid.y = targetDir.y * (1 / dist);
avoid.z = targetDir.z * (1 / dist); avoid.z = targetDir.z * (1 / dist);
Debug.DrawLine(transform.position, -targetDir);
*/ */
//Debug.DrawLine(transform.position, -targetDir);
Vector3 avoid = (-targetDir.normalized * 5) / (dist); Vector3 avoid = (-targetDir.normalized * 5) / (dist);
desiredDirectionToLook += avoid; desiredDirectionToLook += (avoid * Mathf.Pow(avoidInfluence, 3));
//Debug.DrawLine(transform.position, transform.position + avoid); Debug.DrawLine(transform.position, transform.position + (avoid * Mathf.Pow(avoidInfluence, 3)), Color.blue);
//Debug.Log(avoid.magnitude); //Debug.Log(avoid.magnitude);
} }
} }
@@ -168,66 +175,11 @@ public class BoidComponent : MonoBehaviour
return desiredDirectionToLook.normalized; 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) private Vector3 calcCenterInfluenceV3(Vector3 center)
{ {
//Debug.DrawLine(transform.position, center); //Debug.DrawLine(transform.position, center);
return (transform.position - center).normalized; 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);
}
} }
+26 -9
View File
@@ -6,30 +6,41 @@ public class BoidManager : MonoBehaviour
{ {
[SerializeField] public BoidComponent boidTemplate; [SerializeField] public BoidComponent boidTemplate;
[SerializeField] public int boidNum; [SerializeField] public int boidNum;
[SerializeField] [Range(0.0001f, 1)] public float boidCenterInfluence = 0.5f; [SerializeField][Range(1, 180)] public float boidVisionCone;
[SerializeField][Range(0.0001f, 1)] public float boidBoidInfluence = 0.5f; [SerializeField] [Range(0.0001f, 100)] public float boidCenterInfluence = 0.5f;
[SerializeField][Range(1, 100)] public float boidSpeed = 1; [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; [SerializeField][Range(0.0001f, 1f)] public float boidCorneringSpeed = 0.5f;
private float setSpeed; private float setSpeed;
private float setVisionConeAngle;
private float setCenterInfluence; private float setCenterInfluence;
private float setBoidInfluence; private float setAvoidInfluence;
private float setAlignInfluence;
private float setCornering; private float setCornering;
private List<BoidComponent> boids = new List<BoidComponent>(); private List<BoidComponent> boids = new List<BoidComponent>();
public Vector3 center; public Vector3 center;
// Start is called before the first frame update // Start is called before the first frame update
void Start() void Start()
{ {
setSpeed = boidSpeed; setSpeed = boidSpeed;
setVisionConeAngle = boidVisionCone;
setCornering = boidCorneringSpeed; setCornering = boidCorneringSpeed;
setCenterInfluence = boidCenterInfluence; setCenterInfluence = boidCenterInfluence;
setBoidInfluence = boidBoidInfluence; setAlignInfluence = boidAlignInfluence;
setAvoidInfluence = boidAvoidInfluence;
for(int i = 0; i < boidNum; i++) for(int i = 0; i < boidNum; i++)
{ {
BoidComponent tempBoid = BoidComponent.Instantiate(boidTemplate); BoidComponent tempBoid = BoidComponent.Instantiate(boidTemplate);
tempBoid.setCenterInfluence(boidCenterInfluence); 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( tempBoid.transform.position = new Vector3(
Random.Range(0f, 100f), Random.Range(0f, 100f), Random.Range(0f, 100f)); Random.Range(0f, 100f), Random.Range(0f, 100f), Random.Range(0f, 100f));
boids.Add(tempBoid); boids.Add(tempBoid);
@@ -44,19 +55,25 @@ public class BoidManager : MonoBehaviour
boid.Move(); boid.Move();
} }
if (boidSpeed != setSpeed || boidCenterInfluence != setCenterInfluence || if (boidSpeed != setSpeed || setVisionConeAngle != boidVisionCone || boidCenterInfluence != setCenterInfluence ||
boidBoidInfluence != setBoidInfluence || boidCorneringSpeed != setCornering) setAlignInfluence != boidAlignInfluence || setAvoidInfluence != boidAvoidInfluence|| boidCorneringSpeed != setCornering)
{ {
foreach (BoidComponent boid in boids) foreach (BoidComponent boid in boids)
{ {
boid.setSpeed(boidSpeed); boid.setSpeed(boidSpeed);
boid.setVisionConeAngle(boidVisionCone);
boid.setCorneringSpeed(boidCorneringSpeed);
boid.setCenterInfluence(boidCenterInfluence); boid.setCenterInfluence(boidCenterInfluence);
boid.setCorneringSpeed(boidCorneringSpeed); boid.setCorneringSpeed(boidCorneringSpeed);
boid.setAvoidInfluence(boidAvoidInfluence);
boid.setAlignInfluence(boidAlignInfluence);
} }
setSpeed = boidSpeed; setSpeed = boidSpeed;
setCenterInfluence = boidCenterInfluence; setCenterInfluence = boidCenterInfluence;
setCornering = boidCorneringSpeed; setCornering = boidCorneringSpeed;
setAvoidInfluence = boidAvoidInfluence;
setAlignInfluence = boidAlignInfluence;
} }
} }