지극히 개인적인 개발블로그
유니티 머신러닝 4. 다른 예제 실습 본문
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md
이 블로그를 참고하였음을 알려드립니다.
이번 게시글에서는 만들어진 게임이 아닌, 직접 만든 게임을 가지고 머신러닝을 진행해 보겠습니다.
직접 만든 게임이라고 해봐야 높은 수준은 아니니 유니티를 처음 하시는 분들이라도 어렵지 않게 할수 있습니다.
1. 새로운 프로젝트를 만들자
유니티 프로젝트를 만들고 ML-Agent toolkit를 임포트 하겠습니다.
(1)새로운 프로젝트를 만들어 줍시다. 이름은 RollerBall로 하겠습니다.
(2)스크립팅 런타임 버전이 .NET 4.x Equivalent인지 확인해 줍시다. 확인 하는 방법은 저번 게시글에 나와있습니다.
(3)UnitySDK/Asset폴더 안에 Gizmos와 ML-Agents폴더가 있을겁니다. 이 폴더들을 유니티 Asset에 넣어줍시다.
2. 환경을 만들자
(1)바닥을 만들어주고 이름을 Floor로 합니다.
(2)아래 스크린샷처럼 설정을 바꿔줍시다.
(3)위 방법대로 타켓을 만들어 줍시다. 3D Object->Cube선택. 이름은 "Target"
(4)Element 0nt 0는 Block로 하겠습니다.
(5)이젠 Agent를 만들겠습니다. 3D Object -> Sphere선택. 이름은 "RollerAgent"
(6)Element 0은 CheckerSquare로 하겠습니다. 그 후에 Add Component를 누르고 Physics/Rigidbody도 적용해 줍시다. 충돌박스를 설정해 주는 겁니다.
(7)Empty Object를 만들어 줍니다. 이름은 "Academy"
3.아카데미 보강
(1)Academy에 새로운 스크립트를 추가해줍시다. 이름은 RollerAcademy.
(2)해당 스크립트 파일을 열어서 수정해 줍시다.
using MLAgents;
public class RollerAcademy : Academy { }
default함수인 start()와 update()함수는 삭제해 줍시다.
(3)Barin Asset을 만들어주겠습니다. 첫번째 Brain이름은 RollerBallBrain, 두번째 Brain이름은 RollerBallPlayer입니다.
(4)RollerAgent에 스크립트를 하나 추가해줍시다. RollerAgent.cs의 내용은 아래와 같습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MLAgents;
public class RollerAgent : Agent
{
Rigidbody rBody;
// Start is called before the first frame update
void Start()
{
rBody = GetComponent<Rigidbody>();
}
public Transform Target;
public override void AgentReset()
{
if(this.transform.position.y <0)
{
//IF the Agent fell, zero its momentum
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
this.transform.position = new Vector3(0, 0.5f, 0);
}
//Move the target to a new spot
Target.position = new Vector3(Random.value * 8 - 4, 0.5f, Random.value * 8 - 4);
}
}
(5)그 이외에 필요한 함수도 전부 작성하겠습니다.
public override void CollectObservations()
{
//Poisition of the target
AddVectorObs(Target.position);
//Position of the Agent itself
AddVectorObs(this.transform.position);
//the velocity of the Agent
AddVectorObs(rBody.velocity.x);
AddVectorObs(rBody.velocity.z);
}
public float speed = 10;
public override void AgentAction(float[] vectorAction, string textAction)
{
//Actions, size = 2
Vector3 controlSignal = Vector3.zero;
controlSignal.x = vectorAction[0];
controlSignal.z = vectorAction[1];
rBody.AddForce(controlSignal * speed);
//Rewards
float distanceToTarget = Vector3.Distance(this.transform.
position, Target.position);
//Reached target
if(distanceToTarget < 1.42f)
{
SetReward(1.0f);
Done();
}
//Fell off platform
if(this.transform.position.y < 0)
{
Done();
}
}
(6)유니티로 돌아와서 RollerAgent를 수정하겠습니다.
(7)RollerBallBarin과 RollerBallPlayer의 설정도 바꿔줍시다.
(8)RollerBallPlayer Asset을 열어줍시다. Key continuous Player Actions창을 열고 아래와 같이 작성해 줍시다.
(9)