public override void Interact(AnimalCharacter animalCharacter) { animalCharacter.StopMove(); //Set Activity animalCharacter.currentActivity = EActivity.CollectFruit; animalCharacter.animator.SetInteger("animation", 3); //Action //Debug.Log("APond: Collect fish"); StartCoroutine(CollectFish()); IEnumerator CollectFish() { yield return(new WaitForSeconds(this.activityDuration)); animalCharacter.SetIdle(); //Collect Fruit if (fruitCount > 0) //still have fruit { foreach (Transform childTransform in transform) { APickupObject pickupObject = childTransform.GetComponent <APickupObject>(); if (pickupObject) { fruitCount--; //if character do not have object in hand if (!animalCharacter.bHoldObject) { pickupObject.Pickup(animalCharacter); } else //hold an object already, nothing happens { fruitCount++; //pickupObject.MakeDynamic(); //pickupObject.occupied = false; } break; } } } } }
void Update() { fruitGeneratingTimeRemain -= Time.deltaTime; if (fruitGeneratingTimeRemain < 0f) { if (fruitCount <= maxFruitCount) { //Generate fruit GameObject fruit = Instantiate(fruitPrefab, new Vector3(0, 0, 0), Quaternion.identity); APickupObject pickupObject = fruit.GetComponent <APickupObject>(); pickupObject.MakeStatic(); pickupObject.occupied = true; fruit.transform.parent = this.transform; Vector3 boxSize = GetComponent <BoxCollider>().size; fruit.transform.localPosition = new Vector3(Random.Range(-boxSize.x / 6, boxSize.x / 6f), Random.Range(-boxSize.y / 4, 0), Random.Range(-boxSize.z / 6, boxSize.z / 6)); fruitCount++; } fruitGeneratingTimeRemain = fruitGeneratingTime; } }
//Group activity: trade public void Trade() { //stop StopMove(); meetAnimalCharacter.StopMove(); this.agreeCommunication = true; this.bInActivity = true; //meetAnimalCharacter.bInActivity = true; this.animator.SetInteger("animation", 0); this.currentActivity = EActivity.Trade; //if already in trade event if (meetAnimalCharacter.agreeCommunication) { return; } //Debug.LogError("Trade: " + name + " look at " + meetAnimalCharacter.name); //Wait another animalcharacter's response StartCoroutine(WaitTradeRequest(tradeWaitTime)); IEnumerator WaitTradeRequest(float waitTime) { float accumulatedWaitTime = 0f; while (accumulatedWaitTime < waitTime) { accumulatedWaitTime += Time.deltaTime; Debug.Log("Trade look at movement " + this.name + " : " + meetAnimalCharacter.name); this.transform.LookAt(meetAnimalCharacter.transform.position); meetAnimalCharacter.transform.LookAt(this.transform.position); if (meetAnimalCharacter.agreeCommunication) { break; } yield return(null); } //yield return new WaitForSeconds(.1f); //just for delay //if both two agents agree to trade if (this.agreeCommunication && meetAnimalCharacter.agreeCommunication) { Debug.Log("Animal Character !!!Trade!!!: " + this.name + " with " + meetAnimalCharacter.name); APickupObject myObject = this.holdObject; APickupObject hisObject = meetAnimalCharacter.holdObject; //Trade event if (myObject && hisObject) //case 1: exchange goods { //Debug.Log("Animal Character Trade case 1"); myObject.Drop(this); myObject.occupied = true; hisObject.Drop(meetAnimalCharacter); hisObject.occupied = true; myObject.Pickup(meetAnimalCharacter); hisObject.Pickup(this); } else if (myObject == null && hisObject == null) //case 2: nothing happens { //Debug.Log("Animal Character Trade case 2"); } else if (myObject != null && hisObject == null) //case 3: sell { //Debug.Log("Animal Character Trade case 3"); if (meetAnimalCharacter.money > myObject.price) { myObject.Drop(this); myObject.occupied = true; myObject.Pickup(meetAnimalCharacter); this.money += myObject.price; meetAnimalCharacter.money -= myObject.price; } } else if (myObject == null && hisObject != null) //case 4: buy { //Debug.Log("Animal Character Trade case 4"); if (this.money > hisObject.price) { hisObject.Drop(meetAnimalCharacter); hisObject.occupied = true; hisObject.Pickup(this); this.money -= hisObject.price; meetAnimalCharacter.money += hisObject.price; } } } else { //Debug.LogError("Animal Character No trade"); } if (meetAnimalCharacter) { meetAnimalCharacter.SetIdle(); meetAnimalCharacter.agreeCommunication = false; //Debug.LogError("Trade Complete 1"); meetAnimalCharacter.meetAnimalCharacter = null; meetAnimalCharacter = null; //Debug.LogError("Trade Complete 2"); } this.SetIdle(); this.agreeCommunication = false; } }
public void DrawMap(AnimalCharacter animalCharacter, float visionRange = 40f) { CleanChild(); Vector3 characterPosition = animalCharacter.gameObject.transform.position; characterPosition.y = 0; for (int i = 0; i < affordanceObjectList.Count; ++i) { Vector3 objectPosition = affordanceObjectList[i].transform.position; objectPosition.y = 0; if (Vector3.Distance(characterPosition, objectPosition) < visionRange) { //Debug.Log("UIAffordance: " + affordanceObjectList[i].gameObject.name); GameObject affordanceObject = Instantiate(affordanceObjectPrefab, this.transform); //Set UI UIAffordanceObject affordanceUI = affordanceObject.GetComponent <UIAffordanceObject>(); string objectName; string conditionText; string affordanceText; if (affordanceObjectList[i].GetComponent <ASceneTool>()) { objectName = affordanceObjectList[i].GetComponent <ASceneTool>().toolType.ToString(); ASceneTool sceneTool = affordanceObjectList[i].GetComponent <ASceneTool>(); conditionText = sceneTool.animalCharacterNames.Count < sceneTool.maxCapacity ? "(Available)" : ReferenceEquals(animalCharacter.sceneTool, sceneTool) ? "(In)" : "(Occupied)"; affordanceText = sceneTool.animalCharacterNames.Count < sceneTool.maxCapacity ? "[" + sceneTool.activityType.ToString() + "]" : "[None]"; affordanceUI.ChangeNameText(objectName); affordanceUI.ChangeConditionText(conditionText); affordanceUI.ChangeAffordanceText(affordanceText); } else //if (affordanceObjectList[i].GetComponent<APickupObject>()) { APickupObject pickupObject = affordanceObjectList[i].GetComponent <APickupObject>(); objectName = pickupObject.objectType.ToString(); affordanceUI.ChangeNameText(objectName); conditionText = pickupObject.occupied ? "(Occupied)" : ReferenceEquals(animalCharacter.holdObject, pickupObject) ? "(owned)" : "(Available)"; string descriptionText = ""; if (pickupObject as AFood) { descriptionText += " Eatable"; } if (pickupObject as ASeed) { descriptionText += " Plantable"; } affordanceUI.ChangeConditionText(conditionText); affordanceUI.ChangeAffordanceText("[" + descriptionText + "]"); } affordanceUI.ChangeBackGroudColor(AffordanceColor[objectName]); //Draw rectangle RectTransform rt = affordanceUI.gameObject.GetComponent <RectTransform>(); Vector2 offsets = -rt.offsetMax + rt.offsetMin; float offset_x = (objectPosition.x - characterPosition.x) * 4 + rt.rect.width; float offset_y = (-objectPosition.z + characterPosition.z) * 2 + rt.rect.height; //Debug.Log("Affordance rt size: " + rt.rect.width + " " + rt.rect.height); rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, offset_x, AffordanceSize[objectName].x); rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, offset_y, AffordanceSize[objectName].y); ////Draw line //GameObject LineImage = Instantiate(lineImage, this.transform); //RectTransform imageRectTransform = LineImage.GetComponent<RectTransform>(); //Vector2 differenceVector = new Vector2(offset_x, offset_y); ////imageRectTransform.sizeDelta = new Vector2(differenceVector.magnitude, 10f); //imageRectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, offset_x, differenceVector.magnitude); //imageRectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, offset_y, 10f); //imageRectTransform.pivot = new Vector2(0, 0.5f); //imageRectTransform.position = new Vector2(300f, 300f); //float angle = Mathf.Atan2(differenceVector.y, differenceVector.x) * Mathf.Rad2Deg; //imageRectTransform.rotation = Quaternion.Euler(0, 0, angle); } } }