-
Notifications
You must be signed in to change notification settings - Fork 4.3k
/
Copy pathPushAgentEscape.cs
135 lines (123 loc) · 3.77 KB
/
PushAgentEscape.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
public class PushAgentEscape : Agent
{
public GameObject MyKey; //my key gameobject. will be enabled when key picked up.
public bool IHaveAKey; //have i picked up a key
private PushBlockSettings m_PushBlockSettings;
private Rigidbody m_AgentRb;
private DungeonEscapeEnvController m_GameController;
public override void Initialize()
{
m_GameController = GetComponentInParent<DungeonEscapeEnvController>();
m_AgentRb = GetComponent<Rigidbody>();
m_PushBlockSettings = FindObjectOfType<PushBlockSettings>();
MyKey.SetActive(false);
IHaveAKey = false;
}
public override void OnEpisodeBegin()
{
MyKey.SetActive(false);
IHaveAKey = false;
}
public override void CollectObservations(VectorSensor sensor)
{
sensor.AddObservation(IHaveAKey);
}
/// <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);
}
/// <summary>
/// Called every step of the engine. Here the agent takes an action.
/// </summary>
public override void OnActionReceived(ActionBuffers actionBuffers)
{
// Move the agent using the action.
MoveAgent(actionBuffers.DiscreteActions);
}
void OnCollisionEnter(Collision col)
{
if (col.transform.CompareTag("lock"))
{
if (IHaveAKey)
{
MyKey.SetActive(false);
IHaveAKey = false;
m_GameController.UnlockDoor();
}
}
if (col.transform.CompareTag("dragon"))
{
m_GameController.KilledByBaddie(this, col);
MyKey.SetActive(false);
IHaveAKey = false;
}
if (col.transform.CompareTag("portal"))
{
m_GameController.TouchedHazard(this);
}
}
void OnTriggerEnter(Collider col)
{
//if we find a key and it's parent is the main platform we can pick it up
if (col.transform.CompareTag("key") && col.transform.parent == transform.parent && gameObject.activeInHierarchy)
{
print("Picked up key");
MyKey.SetActive(true);
IHaveAKey = true;
col.gameObject.SetActive(false);
}
}
public override void Heuristic(in ActionBuffers actionsOut)
{
var discreteActionsOut = actionsOut.DiscreteActions;
if (Input.GetKey(KeyCode.D))
{
discreteActionsOut[0] = 3;
}
else if (Input.GetKey(KeyCode.W))
{
discreteActionsOut[0] = 1;
}
else if (Input.GetKey(KeyCode.A))
{
discreteActionsOut[0] = 4;
}
else if (Input.GetKey(KeyCode.S))
{
discreteActionsOut[0] = 2;
}
}
}