구현 방법
1. 오브젝트들을 각 종류마다 List로 설정한 후 거리 별로 Sorting 해준다.
List<GameObject> jelly = new List<GameObject>();
List<GameObject> block = new List<GameObject>();
List<GameObject> coin = new List<GameObject>();
jelly.AddRange(GameObject.FindGameObjectsWithTag("jelly"));
block.AddRange(GameObject.FindGameObjectsWithTag("block"));
coin.AddRange(GameObject.FindGameObjectsWithTag("coin"));
jelly.Sort(delegate (GameObject a, GameObject b)
{
return Vector3.Distance(transform.position, a.transform.position).
CompareTo(Vector3.Distance(transform.position, b.transform.position));
});
block.Sort(delegate (GameObject a, GameObject b)
{
return Vector3.Distance(transform.position, a.transform.position).
CompareTo(Vector3.Distance(transform.position, b.transform.position));
});
coin.Sort(delegate (GameObject a, GameObject b)
{
return Vector3.Distance(transform.position, a.transform.position).
CompareTo(Vector3.Distance(transform.position, b.transform.position));
});
2. 각 오브젝트들과 에이전트의 위치를 기준에 대한 float를 관찰해줍니다.
for (int i = 0; i < block.Count; i++)
{
Vector3 dis = block[i].transform.position - transform.position;
AddVectorObs(dis.x);
AddVectorObs(dis.y);
}
for (int i = 0; i < jelly.Count; i++)
{
Vector3 dis = jelly[i].transform.position - transform.position;
AddVectorObs(dis.x);
AddVectorObs(dis.y);
}
for (int i = 0; i < coin.Count; i++)
{
Vector3 dis = coin[i].transform.position - transform.position;
AddVectorObs(dis.x);
AddVectorObs(dis.y);
}
AddVectorObs(transform.position.x);
AddVectorObs(transform.position.y);
3. 에이전트의 행동을 관리하는 함수를 세팅 후 각 상황에 맞게 Switch문을 사용해 구현합니다.
var action = (int)vectorAction[0];
switch (action)
{
case None:
점프 중이 아니라면 실행
break;
case Jump:
슬라이드 중이 아니라면 실행
break;
case Down:
점프 중이 아니라면 실행
break;
}
자세한 함수 별 설명과 사용 방법 및 구현 방법은 추후 추가 될 예정입니다.
구현결과
감사합니다.
'게임프로젝트' 카테고리의 다른 글
ML-Agents 사용 및 기능 설명 (0) | 2020.05.12 |
---|---|
ML-Agents 에이전트, 브레인, 아카데미 란? (0) | 2020.05.11 |
ML-Agents 개발 환경 세팅 (0) | 2020.05.09 |