Пример #1
0
    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Player" || other.gameObject.tag == "Agent")
        {
            //double direction

            AnimalCharacter animalCharacter = other.gameObject.GetComponent <AnimalCharacter>();
            //both sides
            if (this.owner.meetAnimalCharacter == null && animalCharacter.meetAnimalCharacter == null)
            {
                if ((!this.owner.bInActivity) && (!animalCharacter.bInActivity))
                {
                    Debug.Log("Tcone " + owner.name + "Animal Character meet another: " + other.gameObject.name);
                    this.owner.meetAnimalCharacter      = animalCharacter;
                    animalCharacter.meetAnimalCharacter = this.owner;

                    meetCharacterStayTime = 2 * owner.tradeWaitTime;
                }
            }

            //one side
            //if (this.owner.meetAnimalCharacter == null)
            //{
            //    this.owner.meetAnimalCharacter = animalCharacter;
            //}
        }
    }
Пример #2
0
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(ExecuteAfterTime(1f));

        //init belief
        beliefList = new List <float>();
        for (int i = 0; i < 3; i++)
        {
            beliefList.Add(UnityEngine.Random.Range(0f, 1f));
        }

        IEnumerator ExecuteAfterTime(float time)
        {
            yield return(new WaitForSeconds(time));

            animalCharacter = this.GetComponent <AnimalCharacter>();

            //animalCharacter.navControl.TravelTo(appleTreeLocation);
            currentTaskIndex = 0;
            currentTask      = taskList[currentTaskIndex];

            // Code to execute after the delay
            canTakeAction = true;

            //init
            characterState = GetCharacterState();
        }
    }
Пример #3
0
 //Pick up object
 public void Pickup(AnimalCharacter animalCharacter)
 {
     //Debug.Log("APickupObject Pickup");
     this.transform.position          = animalCharacter.holdTransform.position;
     this.transform.parent            = animalCharacter.holdTransform;
     animalCharacter.bHoldObject      = true;
     animalCharacter.meetPickupObject = null;
     animalCharacter.holdObject       = this;
     MakeStatic();
 }
Пример #4
0
    //Drop object
    public void Drop(AnimalCharacter animalCharacter)
    {
        MakeDynamic();
        GetComponent <Rigidbody>().AddForce(animalCharacter.transform.forward * 10f);
        this.occupied = false;
        animalCharacter.bHoldObject = false;
        animalCharacter.holdObject  = null;

        //Register affordance
        UIAffordance.RegisterObject(this.gameObject);
    }
Пример #5
0
    public override void InitializeAgent()
    {
        //initialize location
        animalCharacter = GetComponent <AnimalCharacter>();
        NUM_ITEM_TYPES  = 3;
        NUM_TOOL_TYPES  = 6;
        NUM_MEET_TYPES  = 2;

        secondPerPeriod = 100;
        loopCount       = 1;
    }
Пример #6
0
 private void OnTriggerEnter(Collider other)
 {
     if (other.gameObject.tag == "Player" || other.gameObject.tag == "Agent")
     {
         //Debug.Log("Ascenetool: " + this.toolName + " enters: " + other.gameObject.name);
         //Still have place
         if (animalCharacterNames.Count < maxCapacity)
         {
             AnimalCharacter animalCharacter = other.gameObject.GetComponent <AnimalCharacter>();
             animalCharacterNames.Add(animalCharacter.characterName);
             animalCharacter.sceneTool = this;
         }
     }
 }
Пример #7
0
    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.tag == "Player" || other.gameObject.tag == "Agent")
        {
            //Debug.Log("Ascenetool: " + this.toolName + " exits: " + other.gameObject.name);
            AnimalCharacter animalCharacter = other.gameObject.GetComponent <AnimalCharacter>();
            animalCharacterNames.Remove(animalCharacter.characterName);

            if (ReferenceEquals(animalCharacter.sceneTool, this))
            {
                animalCharacter.sceneTool = null;
            }
        }
    }
Пример #8
0
 public override void Interact(AnimalCharacter animalCharacter)
 {
     //if have seed in hand plant seed
     if (animalCharacter.holdObject != null)
     {
         ASeed seed = animalCharacter.holdObject.GetComponent <APickupObject>() as ASeed;
         if (seed)
         {
             seed.Drop(animalCharacter);
             Plant(seed);
         }
     }
     animalCharacter.SetIdle();
 }
Пример #9
0
 private void OnTriggerExit(Collider other)
 {
     //if (other.gameObject.tag == "Player" || other.gameObject.tag == "Agent")
     if (other.gameObject.tag == "Vision")
     {
         //Debug.Log("APickupObject exits");
         //A character/an agent leaves a pickup object
         AnimalCharacter animalCharacter = other.gameObject.GetComponent <TCone>().owner;
         if (ReferenceEquals(animalCharacter.meetPickupObject, this))
         {
             animalCharacter.meetPickupObject = null;
             occupied = false;
         }
     }
 }
Пример #10
0
 private void OnTriggerEnter(Collider other)
 {
     //if (other.gameObject.tag == "Player" || other.gameObject.tag == "Agent")
     if (other.gameObject.tag == "Vision")
     {
         //Debug.Log("APickupObject enters");
         //A character/an agent sees a pickup object
         AnimalCharacter animalCharacter = other.gameObject.GetComponent <TCone>().owner;
         if (animalCharacter.meetPickupObject == null && !occupied)
         {
             animalCharacter.meetPickupObject = this;
             occupied = true;
         }
     }
 }
Пример #11
0
    //Reset fluents for characters
    public void ResetAnimalCharacter()
    {
        //energy and full
        energy   = 0.5f;
        fullness = 0.5f;
        //Set up start money
        money = 10f;

        this.transform.position = originalLocation;
        this.transform.rotation = Quaternion.identity;

        //Reset activity, animation and nevigation
        SetIdle();

        meetAnimalCharacter = null;
    }
Пример #12
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;
                    }
                }
            }
        }
    }
Пример #13
0
    public override void Interact(AnimalCharacter animalCharacter)
    {
        //Set Activity
        animalCharacter.currentActivity = EActivity.Sleep;
        animalCharacter.animator.SetInteger("animation", 5);

        animalCharacter.StopMove();

        //Action
        //Debug.Log("AHouse: sleep");
        StartCoroutine(SleepNow());

        IEnumerator SleepNow()
        {
            yield return(new WaitForSeconds(activityDuration));

            animalCharacter.SetIdle();

            //Energy gain
            animalCharacter.energy = Mathf.Min(1f, animalCharacter.energy + 0.5f);
        }
    }
Пример #14
0
    //Eat food
    public void Eat(AnimalCharacter animalCharacter)
    {
        animalCharacter.StopMove();

        //Debug.Log("AFood(eat): " + this.objectType.ToString());
        animalCharacter.currentActivity = EActivity.Eat;
        StartCoroutine(EatFood());

        //Eat animation
        animalCharacter.animator.SetInteger("animation", 4);
        IEnumerator EatFood()
        {
            yield return(new WaitForSeconds(this.eatTime));

            animalCharacter.SetIdle();

            //Gain fullness
            animalCharacter.fullness = Mathf.Min(animalCharacter.fullness + fullGain, 1f);

            //Distroy this food
            UIAffordance.UnregisterObject(this.gameObject);
            Destroy(this.gameObject);
        }
    }
Пример #15
0
    void OnTriggerExit(Collider other)
    {
        if (other.gameObject.tag == "Player" || other.gameObject.tag == "Agent")
        {
            //Debug.Log("Player Agent Tcone " + name + " Animal Character exit another : " + other.gameObject.name);
            AnimalCharacter animalCharacter = other.gameObject.GetComponent <AnimalCharacter>();
            if ((owner.agreeCommunication || animalCharacter.agreeCommunication) && ReferenceEquals(this.owner.meetAnimalCharacter, animalCharacter))
            {
                //if (ReferenceEquals(owner, owner.meetAnimalCharacter.meetAnimalCharacter))
                {
                    return;
                }
            }

            //both sides
            if (this.owner.meetAnimalCharacter && animalCharacter.meetAnimalCharacter)
            {
                //Debug.Log("Player Agent Tcone 2222" + name + " Animal Character exit another : " + other.gameObject.name);
                if (ReferenceEquals(this.owner.meetAnimalCharacter, animalCharacter) && ReferenceEquals(animalCharacter.meetAnimalCharacter, this.owner))
                {
                    Debug.Log("Tcone " + owner.name + " Animal Character exit another : " + other.gameObject.name);
                    owner.meetAnimalCharacter           = null;
                    animalCharacter.meetAnimalCharacter = null;
                }
            }

            //one side
            //if (this.owner.meetAnimalCharacter)
            //{
            //    if (ReferenceEquals(this.owner.meetAnimalCharacter, animalCharacter))
            //    {
            //        owner.meetAnimalCharacter = null;
            //    }
            //}
        }
    }
Пример #16
0
    public override void Interact(AnimalCharacter animalCharacter)
    {
        //Set Activity
        animalCharacter.currentActivity = EActivity.Cook;
        //NEED COOK ANIMATION !!!!!!!!!!
        animalCharacter.animator.SetInteger("animation", 5);

        animalCharacter.StopMove();

        //Action
        //Debug.Log("ACampfire: Cook");
        StartCoroutine(Cook());
        IEnumerator Cook()
        {
            if (animalCharacter.holdObject != null)
            {
                AFood food = animalCharacter.holdObject as AFood;
                if (food && food.cookable)
                {
                    Debug.Log("ACampfire Cook:" + food.objectType.ToString());
                    yield return(new WaitForSeconds(food.cookTime));

                    //After cook
                    food.cookable  = false;
                    food.fullGain += 0.3f;

                    //Change material
                    //Color foodColor = food.gameObject.GetComponent<Renderer>().material.color;
                    //food.gameObject.GetComponent<Renderer>().material.color =
                    //    new Color(foodColor.r / 2f, foodColor.g / 2f, foodColor.b / 2, foodColor.a);
                }
            }

            animalCharacter.SetIdle();
        }
    }
Пример #17
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;
        }
    }
Пример #18
0
 // Start is called before the first frame update
 void Start()
 {
     owner = this.transform.parent.GetComponent <AnimalCharacter>();
     Debug.Log("Tcone: owner");
 }
Пример #19
0
    private void Start()
    {
        GameObject player = GameObject.FindWithTag("Player");

        playerCharacter = player.GetComponent <AnimalCharacter>();
    }
Пример #20
0
 //Virtual Act Method: realize interaction between this scene tool and agent
 public virtual void Interact(AnimalCharacter animalCharacter)
 {
     throw new NotImplementedException();
 }
Пример #21
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);
            }
        }
    }