Unity/수업내용(C#)
[3.24] Event를 이용한 드론 조종
ljw4104
2021. 3. 24. 16:51
using System;
namespace Study10
{
public class App
{
public App()
{
DroneController controller = new DroneController();
Drone drone1 = new Drone(100)
drone1.Init(controller);
controller.Control(100, Drone.eDirection.UP);
controller.Control(100, Drone.eDirection.UP);
controller.Control(100, Drone.eDirection.RIGHT);
controller.Control(100, Drone.eDirection.RIGHT);
controller.Control(100, Drone.eDirection.RIGHT);
controller.Control(100, Drone.eDirection.FORWARD);
controller.Control(100, Drone.eDirection.FORWARD);
Console.WriteLine("-------------------------------");
Server.PrintPosition();
}
}
}
using System;
namespace Study10
{
public class Drone
{
public enum eDirection
{
FORWARD, BACK, LEFT, RIGHT, UP, DOWN
}
public int Id { get; private set; }
private DroneController controller;
public Drone(int id)
{
this.Id = id;
}
public void Init(DroneController controller)
{
GPS.AddToGPS(this.Id, Vector3.Zero);
this.controller = controller;
this.controller.onMove += OnMoveEventHandler;
}
private void OnMoveEventHandler(object sender, DroneEventArgs e)
{
if (e.Id == this.Id)
{
this.Move(e.Dir);
}
else
{
Console.WriteLine("권한없는 동작입니다.");
Console.WriteLine("e.Id({0}) != this.Id({1})",e.Id, this.Id);
}
}
public void Move(eDirection dir)
{
Vector3 position = GPS.GetDronePosition(this.Id);
switch ((int)dir)
{
case 0:
position.x++;
GPS.UpdatePosition(this.Id, position);
break;
case 1:
position.x--;
GPS.UpdatePosition(this.Id, position);
break;
case 2:
position.y--;
GPS.UpdatePosition(this.Id, position);
break;
case 3:
position.y++;
GPS.UpdatePosition(this.Id, position);
break;
case 4:
position.z++;
GPS.UpdatePosition(this.Id, position);
break;
case 5:
position.z--;
GPS.UpdatePosition(this.Id, position);
break;
default:
Console.WriteLine("권한없는 행동입니다.");
break;
}
Console.WriteLine(dir);
Server.PrintSpecificPosition(this.Id);
Console.WriteLine("");
}
}
}
using System;
namespace Study10
{
public class DroneEventArgs : EventArgs
{
public Drone.eDirection Dir { get; private set; }
public int Id { get; private set; }
public DroneEventArgs(int id, Drone.eDirection dir)
{
this.Id = id;
this.Dir = dir;
}
}
public class DroneController
{
public event EventHandler<DroneEventArgs> onMove;
GPS gps;
//생성자
public DroneController()
{
gps = new GPS();
}
public void Control(int id, Drone.eDirection dir)
{
DroneEventArgs args = new DroneEventArgs(id, dir);
this.onMove(this, args);
}
}
}
using System;
using System.Collections.Generic;
namespace Study10
{
public struct Vector3
{
public double x;
public double y;
public double z;
public static Vector3 Zero = new Vector3(0, 0, 0);
public Vector3(double x, double y, double z)
{
this.x = x;
this.y = y;
this.z = z;
}
public override string ToString()
{
return String.Format("{0}.{1}.{2}", this.x, this.y, this.z);
}
}
public class GPS
{
protected static Dictionary<int, Vector3> positions;
public GPS()
{
positions = new Dictionary<int, Vector3>();
}
public static void AddToGPS(int n, Vector3 position)
{
positions.Add(n, position);
}
public static bool UpdatePosition(int n, Vector3 position)
{
bool isSuccess = false;
positions[n] = position;
if (positions[n].Equals(position))
{
return true;
}
return isSuccess;
}
public static Vector3 GetDronePosition(int id)
{
return positions[id];
}
public static bool DeleteDrone(int id)
{
return positions.Remove(id);
}
}
}
using System;
using System.Collections.Generic;
namespace Study10
{
public class Server : GPS
{
//서버는 GPS의 정보를 출력만 함.
public Server()
{
}
public static void PrintPosition()
{
foreach (KeyValuePair<int, Vector3> item in positions)
{
Console.WriteLine("Id : {0}, Position : {1}", item.Key, item.Value);
}
}
public static void PrintSpecificPosition(int id)
{
Console.WriteLine("Id : {0}, Position : {1}", id, positions[id]);
}
}
}
GPS는 드론이 움직일때마다 좌표를 추적하며 App에서는 절대 GPS를 조작할 수 없다. App은 Server 클래스에서만 제공되는 print함수를 사용하여 드론의 위치를 확인할 수 있다.
GPS는 안에 Dictionary자료구조로 저장되며 key는 드론의 id, value는 Vector3 형식의 positions로 저장된다.