Example #1
0
    /// <summary>
    /// Moves the agent according to the selected action.
    /// </summary>
    public void MoveAgent(ActionSegment <int> act)
    {
        var dirToGo   = Vector3.zero;
        var rotateDir = Vector3.zero;

        var action = act[0];

        switch (action)
        {
        case 1:
            dirToGo = transform.forward * 1f;
            break;

        case 2:
            dirToGo = transform.forward * -1f;
            break;

        case 3:
            rotateDir = transform.up * 1f;
            break;

        case 4:
            rotateDir = transform.up * -1f;
            break;

        case 5:
            dirToGo = transform.right * -0.75f;
            break;

        case 6:
            dirToGo = transform.right * 0.75f;
            break;
        }
        transform.Rotate(rotateDir, Time.fixedDeltaTime * 200f);
        m_AgentRb.AddForce(dirToGo * m_PushBlockSettings.agentRunSpeed,
                           ForceMode.VelocityChange);
    }
Example #2
0
    public void MoveAgent(ActionSegment <int> act)
    {
        AddReward(-0.0005f);
        var smallGrounded = DoGroundCheck(true);
        var largeGrounded = DoGroundCheck(false);

        var dirToGo              = Vector3.zero;
        var rotateDir            = Vector3.zero;
        var dirToGoForwardAction = act[0];
        var rotateDirAction      = act[1];
        var dirToGoSideAction    = act[2];
        var jumpAction           = act[3];

        if (dirToGoForwardAction == 1)
        {
            dirToGo = (largeGrounded ? 1f : 0.5f) * 1f * transform.forward;
        }
        else if (dirToGoForwardAction == 2)
        {
            dirToGo = (largeGrounded ? 1f : 0.5f) * -1f * transform.forward;
        }
        if (rotateDirAction == 1)
        {
            rotateDir = transform.up * -1f;
        }
        else if (rotateDirAction == 2)
        {
            rotateDir = transform.up * 1f;
        }
        if (dirToGoSideAction == 1)
        {
            dirToGo = (largeGrounded ? 1f : 0.5f) * -0.6f * transform.right;
        }
        else if (dirToGoSideAction == 2)
        {
            dirToGo = (largeGrounded ? 1f : 0.5f) * 0.6f * transform.right;
        }
        if (jumpAction == 1)
        {
            if ((jumpingTime <= 0f) && smallGrounded)
            {
                Jump();
            }
        }

        transform.Rotate(rotateDir, Time.fixedDeltaTime * 300f);
        m_AgentRb.AddForce(dirToGo * m_WallJumpSettings.agentRunSpeed,
                           ForceMode.VelocityChange);

        if (jumpingTime > 0f)
        {
            m_JumpTargetPos =
                new Vector3(m_AgentRb.position.x,
                            m_JumpStartingPos.y + m_WallJumpSettings.agentJumpHeight,
                            m_AgentRb.position.z) + dirToGo;
            MoveTowards(m_JumpTargetPos, m_AgentRb, m_WallJumpSettings.agentJumpVelocity,
                        m_WallJumpSettings.agentJumpVelocityMaxChange);
        }

        if (!(jumpingTime > 0f) && !largeGrounded)
        {
            m_AgentRb.AddForce(
                Vector3.down * fallingForce, ForceMode.Acceleration);
        }
        jumpingTime -= Time.fixedDeltaTime;
    }
Example #3
0
    public void MoveAgent(ActionSegment <int> act)
    {
        m_Shoot = false;

        if (Time.time > m_FrozenTime + 4f && m_Frozen)
        {
            Unfreeze();
        }
        if (Time.time > m_EffectTime + 0.5f)
        {
            if (m_Poisoned)
            {
                Unpoison();
            }
            if (m_Satiated)
            {
                Unsatiate();
            }
        }

        var dirToGo   = Vector3.zero;
        var rotateDir = Vector3.zero;

        if (!m_Frozen)
        {
            var shootCommand = false;
            var forwardAxis  = (int)act[0];
            var rightAxis    = (int)act[1];
            var rotateAxis   = (int)act[2];
            var shootAxis    = (int)act[3];

            switch (forwardAxis)
            {
            case 1:
                dirToGo = transform.forward;
                break;

            case 2:
                dirToGo = -transform.forward;
                break;
            }

            switch (rightAxis)
            {
            case 1:
                dirToGo = transform.right;
                break;

            case 2:
                dirToGo = -transform.right;
                break;
            }

            switch (rotateAxis)
            {
            case 1:
                rotateDir = -transform.up;
                break;

            case 2:
                rotateDir = transform.up;
                break;
            }
            switch (shootAxis)
            {
            case 1:
                shootCommand = true;
                break;
            }
            if (shootCommand)
            {
                m_Shoot             = true;
                dirToGo            *= 0.5f;
                m_AgentRb.velocity *= 0.75f;
            }
            m_AgentRb.AddForce(dirToGo * moveSpeed, ForceMode.VelocityChange);
            transform.Rotate(rotateDir, Time.fixedDeltaTime * turnSpeed);
        }

        if (m_AgentRb.velocity.sqrMagnitude > 25f) // slow it down
        {
            m_AgentRb.velocity *= 0.95f;
        }

        if (m_Shoot)
        {
            var myTransform = transform;
            myLaser.transform.localScale = new Vector3(1f, 1f, m_LaserLength);
            var rayDir = 25.0f * myTransform.forward;
            Debug.DrawRay(myTransform.position, rayDir, Color.red, 0f, true);
            RaycastHit hit;
            if (Physics.SphereCast(transform.position, 2f, rayDir, out hit, 25f))
            {
                if (hit.collider.gameObject.CompareTag("agent"))
                {
                    hit.collider.gameObject.GetComponent <FoodCollectorAgent>().Freeze();
                }
            }
        }
        else
        {
            myLaser.transform.localScale = new Vector3(0f, 0f, 0f);
        }
    }
Example #4
0
    /// <summary>
    /// Called when an action is received from either the player input or the neural network
    /// </summary>
    /// vectorAction[i] represents:
    /// Index 0: move vector z (+1 = right -1 = left)
    /// Index 1: yaw angle z (+1 = right -1 = left)
    /// Index 1: pitch angle z (+1 = right -1 = left)
    /// <param name="actionBuffers"> The actions to take </param>
    public override void OnActionReceived(ActionBuffers actionBuffers)
    {
        ActionSegment <int> act  = actionBuffers.DiscreteActions;
        var dirToGo              = Vector3.zero;
        var rotateDir            = Vector3.zero;
        var rotateMonitor        = 0f;
        var dirToGoForwardAction = act[0];
        var rotateDirAction      = act[1];
        var rotateMonitorAction  = act[2];

        if (dirToGoForwardAction == 1)
        {
            dirToGo = 1f * transform.forward;
        }
        else if (dirToGoForwardAction == 2)
        {
            dirToGo = -1f * transform.forward;
        }
        if (rotateDirAction == 1)
        {
            rotateDir = transform.up * -1f;
        }
        else if (rotateDirAction == 2)
        {
            rotateDir = transform.up * 1f;
        }
        if (rotateMonitorAction == 1)
        {
            rotateMonitor = -1f;
        }
        else if (rotateMonitorAction == 2)
        {
            rotateMonitor = 1f;
        }

        rigidbody.AddForce(dirToGo * moveForce, ForceMode.VelocityChange);
        transform.Rotate(rotateDir, Time.fixedDeltaTime * yawSpeed);

        monitorLocalAngle += rotateMonitor * pitchSpeed * Time.fixedDeltaTime;
        monitorLocalAngle  = Mathf.Clamp(monitorLocalAngle, MinPitchAngle, MaxPitchAngle);

        monitor.transform.localRotation = Quaternion.Euler(monitorLocalAngle, 0, 0);

        if (rigidbody.velocity.sqrMagnitude > 0.5f) // slow it down
        {
            rigidbody.velocity *= 0.7f;
        }

        Vector3 screenPos = agentCamera.WorldToScreenPoint(dockingStation.transform.position);

        steps++;
        stepsEpoch++;

        if (stepsEpoch == MaxStep - 1)
        {
            successfulDocking = false;
            dockingTime       = 0.02f * MaxStep;

            String first  = distanceFromDocker.ToString();
            String second = spawningAngle.ToString();
            String third  = MaxStep.ToString();
            String fourth = successfulDocking.ToString();
            String fifth  = dockingTime.ToString();
            Debug.Log("Docking not successful in epoch " + epoch);
            var newLine = string.Format("{0};{1};{2};{3};{4}", first, second, third, fourth, fifth);
            Debug.Log(newLine);
            csv.AppendLine(newLine);
        }

        if (steps >= 1)
        {
            //bool patternFound = Utils.isPatternVisible(agentCamera);
            bool patternFound = (screenPos.x > 0) & (screenPos.x < agentCamera.pixelWidth) & (screenPos.y > 0) & (screenPos.y < agentCamera.pixelHeight) & (screenPos.z > 0) & (screenPos.z < 10);
            //Debug.Log("Pattern found? " + patternFound);
            if (patternFound)
            {
                float reward_x = Mathf.Abs(screenPos.x - (agentCamera.pixelWidth / 2));  // [0 - agentCamera.pixelWidth/2]
                reward_x = -reward_x / (agentCamera.pixelWidth / 4) + 3;                 // [1-3]
                float reward_y = Mathf.Abs(screenPos.y - (agentCamera.pixelHeight / 2)); // [0 - agentCamera.pixelHeight/2]
                reward_y = -reward_y / (agentCamera.pixelHeight / 4) + 3;                // [1-3]
                //float reward_scale = screenPos.z<1.25f?3:0; // [0-3]
                float reward_scale   = Mathf.Clamp(3 - screenPos.z, 0, 3);
                float reward_pattern = ((reward_x + reward_y + reward_scale) * steps) / (MaxStep * 9f);
                //AddReward(reward_pattern);
                //Debug.Log("Reward for detecting the pattern of: " + reward_pattern + ", detected at coordinates: " + screenPos);
            }
            else
            {
                float reward_pattern = -((float)steps / (float)MaxStep);
                //AddReward(reward_pattern);
                //Debug.Log("Reward for not detecting the pattern of: " + reward_pattern);
            }
            steps = steps % 1;
        }
    }
    public void ActionCat(ActionSegment <int> action)
    {
        //에피소드 끝내는 것 .
        if (order_count <= 0)
        {
            EndEpisode();
        }
        if (love_gauge <= 0 || loyal_gauge <= 0)
        {
            Flee();
        }
        if (condition_gauge <= 0)
        {
            Dead();
        }
        if (fun_gauge <= 0)
        {
            Rage();
        }
        //
        Order();
        //
        Debug.Log("awdf");

        if (AnimSwitch == false && order_count > 0)
        {
            randomOrder = Random.Range(1, 5);
            //일부러 랜덤 값을 주어서 , 학습에 제약을 주어서 더욱 학습 성능 높히기 . 행동 제약
            //값을 받아도 다른걸 실행시키지 않게 됨 .
            //나중에는 내가 여기에 randomOrder 값을 조정해서 명령 내리도록 하면 될 듯 .
            OrderToAction = (int)action[0];

            switch (OrderToAction)
            {
            case 1:
                if (randomOrder == 1)
                {
                    Sleep();
                    SetReward(0.8f);
                    loyal_gauge += 10f;
                    actionFlag   = false;
                }
                break;

            case 2:
                if (randomOrder == 2)
                {
                    Sit();
                    SetReward(0.5f);
                    loyal_gauge += 10f;
                    actionFlag   = false;
                }
                break;

            //졸릴때 놀면 더 피곤해짐 .
            case 3:
                if (randomOrder == 3)
                {
                    Run();
                    SetReward(0.3f);
                    loyal_gauge += 10f;
                    actionFlag   = false;
                }
                break;

            default:
                SetReward(-1f);
                loyal_gauge -= 4f;
                actionFlag   = false;
                break;
            }
        }
    }