/// <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); }
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; }
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); } }
/// <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; } } }