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로 저장된다.