void Start() { behaviour = GetComponent <AnimalBehaviour>(); foodLayer = LayerMask.GetMask("Food"); animalLayer = LayerMask.GetMask("Animals"); }
void MutateChild(AnimalBehaviour child, AnimalBehaviour mate) { AnimalBehaviour chosenParent; chosenParent = (Random.value > 0.5) ? mate : this; child.speed = chosenParent.speed + NormalDistribution(0, 0.3f) * mutationAmount; if (child.speed < 0.2) { child.speed = 0.2f; } chosenParent = (Random.value > 0.5) ? mate : this; child.senseRadius = chosenParent.senseRadius + NormalDistribution(0, 0.5f) * mutationAmount; if (child.senseRadius < 1) { child.senseRadius = 1; } chosenParent = (Random.value > 0.5) ? mate : this; child.reproductionThreshold = chosenParent.reproductionThreshold + NormalDistribution(0, 1f) * mutationAmount; chosenParent = (Random.value > 0.5) ? mate : this; child.passedEnergy = chosenParent.passedEnergy + NormalDistribution(0, 1f) * mutationAmount; if (child.passedEnergy < 0) { child.passedEnergy = 0; } }
IEnumerator DataLogger() { string filePath = Path.Combine(@"./Assets/SimulationLogs/", System.DateTime.Now.ToString("ddMMyyyy_HHmmss") + ".csv"); using (StreamWriter writer = new StreamWriter(filePath)) { writer.WriteLine("Time,Number of Animals,Average sense radius, Average speed,Average reproduction threshold,Average passed energy"); while (transform.childCount > 0) { numberOfListEntries++; float timeStamp = numberOfListEntries * (1 / logFrequency); float animalCount = transform.childCount; float senseRadius = 0; float speed = 0; float reproductionThreshold = 0; float passedEnergy = 0; foreach (Transform animal in transform) { AnimalBehaviour behaviour = animal.GetComponent <AnimalBehaviour>(); senseRadius += behaviour.senseRadius; speed += behaviour.speed; reproductionThreshold += behaviour.reproductionThreshold; passedEnergy += behaviour.passedEnergy; } senseRadius = senseRadius / animalCount; speed = speed / animalCount; reproductionThreshold = reproductionThreshold / animalCount; passedEnergy = passedEnergy / animalCount; writer.WriteLine(FormatOutput($"{timeStamp},{animalCount},{senseRadius*valueMultiplier},{speed*valueMultiplier},{reproductionThreshold*valueMultiplier},{passedEnergy*valueMultiplier}")); yield return(new WaitForSeconds(1 / (logFrequency * simulationSpeed))); } } }
private void Awake() { m_animalFOV = this.gameObject.AddComponent <AnimalFOV>(); m_animalMesh = GetComponentInChildren <AnimalMesh>(); m_animalAwareness = gameObject.AddComponent <AnimalAwareness>(); m_animalBehaviour = gameObject.AddComponent <AnimalBehaviour>(); }
private void Start() { rb = GetComponent <Rigidbody2D>(); StartCoroutine(ChooseNewDirection(timeTilDirectionChange)); state = CharacterState.HEALTHY; behaviour = AnimalBehaviour.WANDERING; }
void Start() { canvas = transform.parent.GetComponent <AnimalSimulation>().animalCanvas; mainCamera = transform.parent.GetComponent <AnimalSimulation>().mainCamera; behaviour = transform.GetComponent <AnimalBehaviour>(); infoText = CreateInfoText(); }
// Start is called before the first frame update void Start() { animal = GetComponentInParent <AnimalBehaviour>(); drink = startDrink; food = startFood; health = startHealth; maxReprod = 100.0f; targetCamera = GameObject.FindGameObjectWithTag("MainCamera").transform; }
// Update is called once per frame void Update() { if (Input.GetKey(KeyCode.Space)) { scale += spread; } if (Input.GetKeyUp(KeyCode.Space)) { dmgArea.SetActive(true); scream.SetActive(false); dmgArea.transform.localScale = new Vector3(scale, thin, scale); Vector2 pos = new Vector2(transform.position.x, transform.position.y); Collider2D[] colliders = Physics2D.OverlapCircleAll(pos, 0.66f * scale, mask); // 0.5 is the radius of the collider for (int i = 0; i < colliders.Length; i++) { AnimalBehaviour animal = colliders[i].gameObject.GetComponent <AnimalBehaviour>(); if (animal) { animal.scared = true; audioSource.PlayOneShot(audioClip); } Vector3 dist = animal.transform.position - transform.position; float n = dist.magnitude; } scale = initialRadius; } if (dmgArea.activeInHierarchy) { if (currentDmgDuration < dmgDuration) { currentDmgDuration += Time.deltaTime; if (currentDmgDuration < dmgDuration * j / 4) { dmgArea.transform.Rotate(new Vector3(0, 50, 0)); dmgArea.transform.localScale = new Vector3(dmgArea.transform.localScale.x - 0.05f * ((-1) ^ j), thin, dmgArea.transform.localScale.z - 0.05f * ((-1) ^ j)); j++; } } else { dmgArea.SetActive(false); scream.SetActive(true); currentDmgDuration = 0; j = 1; } } scale = Mathf.Clamp(scale, 0, maxRadius); scream.transform.localScale = new Vector3(scale, thin, scale); scream.transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z + 0.5f); dmgArea.transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z + 0.5f); }
public void MakeBaby(int numberOfBabies, int motherRef) { float mutate = Random.Range(1, 100); AnimalBehaviour animal; AnimalBehaviour mother = animalList [motherRef]; Vector3 pos = mother.Getposition(); float newPosX = Random.Range(-5.0f, 5.0f); float newPosZ = Random.Range(-5.0f, 5.0f); AnimalBehaviour.AnimalType type; int ID = mother.GetSpeciiesID(); float energy, maxAge, maxSize; float speed, rot, foodSize, eatEff, willToLive; for (int i = 0; i < numberOfBabies; i++) { type = mother.GetType(); energy = mother.GiveEnergyToYoung(); maxAge = mother.GetMaxAge(); maxSize = mother.GetMaxSize(); speed = mother.GetSpeed(); rot = mother.GetRot(); foodSize = mother.GetFoodSize(); eatEff = mother.GetEatEff(); willToLive = mother.GetWillToLive(); pos = new Vector3(pos.x + newPosX, pos.y, pos.z + newPosZ); if (mutate <= 20) { //make a new species //Randomise stuff here ID++; } if(type == AnimalBehaviour.AnimalType.herbivore) { animalObj = herbivoreObj; } else{ animalObj = carnivoreObj; } animal = Instantiate(animalObj, pos, Quaternion.identity)as AnimalBehaviour; animal.newAnimal(type, ID, pos, energy, maxAge, maxSize, speed, rot, foodSize, eatEff, willToLive); animalList.Add(animal); speciesList.Add(ID); speciesList[ID]++; } }
// Use this for initialization void Awake() { // Make sure we have stack manager stackManager = Utility.GetComponentFromTag<StackManager>("StackManager"); // Set up the box collider boxCollider = gameObject.GetComponent<BoxCollider>(); boxCollider.transform.localScale = new Vector3(1.5f, 1.1f ,1.5f); boxCollider.transform.localPosition = new Vector3(0.0f, 0.5f, 0.0f); boxCollider.isTrigger = true; // Get parent object objParent = transform.parent.gameObject; animalBehaviour = objParent.GetComponent<AnimalBehaviour>(); // Start disabled Disable(); }
void Update() { // Dont process if we are frozen if (Time.timeScale == 0) return; if (controlledAnimal == null) { controlledAnimal = stackManager.currentAnimal.GetComponent<AnimalBehaviour>(); } else { // Handle input based on input type if (usePS4Controller) { HandlePS4Input(); } else { HandleKeyboardInput(); } } }
private void HandleModes() { if (!controlledAnimal.CanThrow()) { return; } if (usePS4Controller) { if (Input.GetAxis("PS4_BUTTON_R2") > 0.0f) { // Setup throwing mode if (throwingMode == false) { //if throwing mode is activated while the controlled animal has been moved a little on top of another stack without stepping off completely, remerge before activating throwing mode for (int i =0; i<stackManager.levelStacks.Count; i++) { if (controlledAnimal.parentStack.Equals(stackManager.levelStacks [i])) continue; if (!controlledAnimal.beingThrown && (controlledAnimal.rigidBody.velocity.y >= (-0.001f)) && (Mathf.Abs(controlledAnimal.transform.position.x - stackManager.levelStacks [i].Get(0).transform.position.x) <= (controlledAnimal.animalHeight + 0.2f)) && (Mathf.Abs(controlledAnimal.transform.position.z - stackManager.levelStacks [i].Get(0).transform.position.z) <= (controlledAnimal.animalHeight + 0.2f))) { controlledAnimal.Stop(); stackManager.MergeStack(stackManager.levelStacks [i], controlledAnimal.parentStack, ExecutePosition.BOTTOM); StartCoroutine(controlledAnimal.DisableMovement()); controlledAnimal.Stop(); // Tell the stack manager to update to the correct animal stackManager.UpdateSelectedAnimal(stackManager.gameAnimals [animalIndex]); // Update controlled animal controlledAnimal = stackManager.currentAnimal.GetComponent<AnimalBehaviour>(); } } //Stop animal if moving controlledAnimal.currentVelocity = Vector3.zero; throwManager.ActivateThrowingMode(controlledAnimal); } throwManager.HandleCannonRotation(); throwingMode = true; } else { // Trigger released - throw if (throwingMode == true) { ControllerThrowCall(); } throwingMode = false; } } else { if (Input.GetKeyDown(throwingWinKey)) { throwingMode = !throwingMode; if (throwingMode) { throwManager.ActivateThrowingMode(controlledAnimal); controlledAnimal.currentVelocity = Vector3.zero; } else { throwManager.DeactivateThrowingMode(); } } } }
// Use this for initialization void Start() { view_cone_polygon = gameObject.GetComponent <PolygonCollider2D>(); animal_behaviour = gameObject.GetComponentInParent <AnimalBehaviour>(); points = new Vector2[6]; }
public void HandleAnimalKeyboardThrowing() { if (Input.GetKey(KeyCode.RightArrow)) { throwManager.RotateRight(); } if (Input.GetKey(KeyCode.LeftArrow)) { throwManager.RotateLeft(); } if (Input.GetKey(KeyCode.UpArrow)) { throwManager.RotateDown(); } if (Input.GetKey(KeyCode.DownArrow)) { throwManager.RotateUp(); } if (Input.GetKeyDown(throwWinKey)) { if (throwManager.trajectories.isThrowAllowed) { if (throwManager.CallThrow(controlledAnimal.gameObject, false)) { // If throw was successful - change controlled animal controlledAnimal = controlledAnimal.GetAnimalAbove().GetComponent<AnimalBehaviour>(); } throwingMode = false; } } }
//============================================================================== // Throwing Input //============================================================================== private void ControllerThrowCall() { if (throwManager.CallThrow(controlledAnimal.gameObject, true)) { // If throw was successful - change controlled animal controlledAnimal = controlledAnimal.GetAnimalAbove().GetComponent<AnimalBehaviour>(); animalIndex = stackManager.gameAnimals.IndexOf(controlledAnimal.gameObject); } }
private void HandleAnimalSwitching(KeyCode key, int value) { // Check to make sure we do want to switch if (!Input.GetKeyDown(key)) return; // Check animal is not being thrown or in mid-air if (!controlledAnimal.beingThrown && controlledAnimal.parentStack.Get(0).GetComponent<AnimalBehaviour>().isGrounded) { Debug.Log("Able to switch!"); // Disable move velocity controlledAnimal.Stop(); // Change index animalIndex = value; // Keep within the range Utility.Wrap(ref animalIndex, 0, stackManager.gameAnimals.Count - 1); // Tell the stack manager to update to the correct animal stackManager.UpdateSelectedAnimal(stackManager.gameAnimals [animalIndex]); // Update controlled animal controlledAnimal = stackManager.currentAnimal.GetComponent<AnimalBehaviour>(); // Revert to movement mode upon animal change if (throwingMode) { throwingMode = false; throwManager.DeactivateThrowingMode(); } return; } //look for the stack the controlled animals stack is currently on top of and remerge with it, before controlled animal is changed for (int i =0; i<stackManager.levelStacks.Count; i++) { if (controlledAnimal.parentStack.Equals(stackManager.levelStacks [i])) { //Debug.Log("Index of Parentstack:"+i); continue; } //Debug.Log(controlledAnimal.rigidBody.velocity.y); //Debug.Log(Mathf.Abs(controlledAnimal.transform.position.x - stackManager.levelStacks[i].Get(0).transform.position.x)); //Debug.Log(Mathf.Abs(controlledAnimal.transform.position.z - stackManager.levelStacks[i].Get(0).transform.position.z)); //check if animal is not being thrown, falling and overlapping with another stack on the x- and z-plane if (!controlledAnimal.beingThrown && (controlledAnimal.rigidBody.velocity.y >= (-0.001f)) && (Mathf.Abs(controlledAnimal.transform.position.x - stackManager.levelStacks [i].Get(0).transform.position.x) <= (controlledAnimal.animalHeight + 0.2f)) && (Mathf.Abs(controlledAnimal.transform.position.z - stackManager.levelStacks [i].Get(0).transform.position.z) <= (controlledAnimal.animalHeight + 0.2f))) { //Debug.Log("Here"); if (throwingMode) { throwingMode = false; throwManager.DeactivateThrowingMode(); } controlledAnimal.Stop(); stackManager.MergeStack(stackManager.levelStacks [i], controlledAnimal.parentStack, ExecutePosition.BOTTOM); StartCoroutine(controlledAnimal.DisableMovement()); controlledAnimal.Stop(); animalIndex = value; // Keep within the range Utility.Wrap(ref animalIndex, 0, stackManager.gameAnimals.Count - 1); // Tell the stack manager to update to the correct animal stackManager.UpdateSelectedAnimal(stackManager.gameAnimals [animalIndex]); // Update controlled animal controlledAnimal = stackManager.currentAnimal.GetComponent<AnimalBehaviour>(); return; } } }
public void AssignTreatment(AnimalBehaviour.TREATMENTS treatment) { this.treatment = treatment; }
// Update is called once per frame void Update() { gameTime += Time.deltaTime; //Start Simulation if (Input.GetKeyDown(KeyCode.Z)) { AnimalBehaviour animal; animalObj = herbivoreObj; Vector3 pos = new Vector3(0, 0.5f, 0); animal = Instantiate(animalObj, pos, Quaternion.identity)as AnimalBehaviour; animal.newAnimal(AnimalBehaviour.AnimalType.herbivore,0, pos, 15, 20, 1,4, 0.075f, 4, 0.5f, 1.0f); animalList.Add(animal); speciesList [0]++; Invoke("MakeCarnivore",0.2f *(60.0f)); // make carnivores after a given amount of minutes. } for (int i = 0; i < animalList.Count; i++) { if (animalList [i] == null) { int specIndex = animalList [i].thisAnimalSpeciesID; animalList.Remove(animalList [i]); speciesList[specIndex]--; }else{ if (animalList [i].GetIfReadyToPop() && animalList.Count <= MaxNumberOfAnimals) { MakeBaby(2, i); animalList [i].setReadyToPop(false); } } } }
public void OnPathFinished() //Will be called upon reaching the destination { pathfinder.ClearPath(); switch (status) { case 0: GoSearchPath(); break; case 1: if (pathTarget != null) { simulation.foodSpawner.allFoodPositions.Remove(GridHelper.WorldPosToGridPos(pathTarget.transform.position)); Destroy(pathTarget); energy += foodEnergyGain; } pathTarget = null; if (energy > reproductionThreshold) { status = 2; } else { status = 0; } GoSearchPath(); break; case 2: GoSearchPath(); break; case 3: if (pathTarget != null) { AnimalBehaviour mateBehaviour = pathTarget.GetComponent <AnimalBehaviour>(); if (mateBehaviour.status == 4) { GameObject childAnimal = transform.parent.GetComponent <AnimalSimulation>().NewAnimal(transform.position); AnimalBehaviour childBehaviour = childAnimal.GetComponent <AnimalBehaviour>(); energy -= passedEnergy; mateBehaviour.energy -= mateBehaviour.passedEnergy; childBehaviour.energy = passedEnergy + mateBehaviour.passedEnergy; MutateChild(childBehaviour, mateBehaviour); if (energy > reproductionThreshold) { status = 2; } else { status = 0; } if (mateBehaviour.energy > mateBehaviour.reproductionThreshold) { mateBehaviour.status = 2; } else { mateBehaviour.status = 0; } pathTarget = null; mateBehaviour.pathTarget = null; GoSearchPath(); mateBehaviour.GoSearchPath(); } else { status = 4; } } else { if (energy > reproductionThreshold) { status = 2; } else { status = 0; } GoSearchPath(); } break; default: break; } }
public void OnStep() //Will be called each step { energy = EnergyFormula(energy); //Apply the energy formula sensing.Sense(); switch (status) { case 0: if (sensing.closestFood != null) { pathfinder.ClearPath(); status = 1; pathTarget = sensing.closestFood.gameObject; pathfinder.GoPath(sensing.closestFood, speed); } else if (energy > reproductionThreshold) { status = 2; } break; case 1: if (pathTarget == null) { pathfinder.ClearPath(); status = 0; GoSearchPath(); } break; case 2: if (sensing.closestMate != null) { AnimalBehaviour mateBehaviour = sensing.closestMate.GetComponent <AnimalBehaviour>(); if (mateBehaviour.status == 2) { Vector2Int meetingPoint = mateBehaviour.PingMate(transform); pathfinder.ClearPath(); status = 3; pathTarget = sensing.closestMate.gameObject; pathfinder.GoPath(GridHelper.GridPosToWorldPos(meetingPoint, transform.position.y), speed); } } else if (energy < reproductionThreshold) { status = 0; } break; case 3: if (pathTarget == null) { pathfinder.ClearPath(); if (energy > reproductionThreshold) { status = 2; } else { status = 0; } GoSearchPath(); } break; default: break; } }
public void ActivateThrowingMode( AnimalBehaviour controlledAnimal ) { // Place cannon at animal and orient it properly cannon.transform.position = controlledAnimal.transform.position; cannon.transform.rotation = controlledAnimal.transform.rotation; this.throwingAnimal = controlledAnimal.gameObject; this.throwAnimal = throwingAnimal.GetComponent<AnimalBehaviour>().GetAnimalAbove(); trajectories.animalBeingThrown = throwAnimal.GetComponent<AnimalBehaviour>(); trajectories.speciesBeingThrown = trajectories.animalBeingThrown.animalSpecies; trajectories.IgnoreAnimals(); trajectories.SimulatePath(); cannon.transform.parent.gameObject.SetActive(true); invisibleWalls.SetActive(false); }
void EatAnimal(AnimalBehaviour animal) { float maxFood = animal.StealEnergy(eatSize); maxFood = (maxFood / eatEffeciency); energy += maxFood; hunger += maxFood; }