예제 #1
0
    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;
                    }
                }
            }
        }
    }
예제 #2
0
    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;
        }
    }
예제 #3
0
    //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;
        }
    }
예제 #4
0
    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);
            }
        }
    }