패스트캠퍼스의 "업무자동화 MAX 올인원 패키지 Online" 강의 내용을 공부하며 정리할 예정입니다.
01. 엑셀 필수 기초 (Basic) I 데이터 축적 02. 엑셀 필수 기초 (Basic) II 데이터 생산 03. 엑셀 피수 기초 (Basic) III 데이터 분석 04. 엑셀 프로젝트(Project) 05. 엑셀 VBA 필수 기초 06. 엑셀 VBA 실전 프로젝트 07. 오토핫키 필수 기초(Basic) 08. 오토핫키 실전 프로젝트(Project) 09. 구글 스프레드시트 필수 기초 10. 구글 앱스스크립트 기본 및 실전 프로젝트 11. 파이썬 업무자동화 (Basic) 12. 파이썬 업무자동화 (Intermediate) 13. 파이썬 업무자동화 (Advanced)
구글 스프레드 시트는 좋기는 한데 너무 느려서 애매하고, 엑셀은 정말 많이 사용하고, 툴은 좋긴 하지만 지속 누군가가 수정을 해줘야 하는데 그렇게 여유로는 모바일 게임 개발사는 없을 것이기에.. 결국 Table of Data를 처리하기 위한 방법들이 필요합니다.
GeneralStats 스크립트를 해당 위치에 생성하고 작성을 시작합니다.
[CreateAssetMenu(menuName="PluggableAI/GeneralStats")] public class GeneralStats : ScriptableObject { [Header("General")] [Tooltip("npc 정찰 속도 clear state")] public float patrolSpeed = 2f; [Tooltip("npc 따라오는 속도 warning state")] public float chaseSpeed = 5f; [Tooltip("npc 회피하는 속도 engage state")] // 교전시 public float evadeSpeed = 15; [Tooltip("웨이포인트에서 대기하는 시간")] public float patrolWaitTime = 2f; [Header("Animation")] public LayerMask obstacleMask; // 장애물 레이어 마스크 public float angleDeadZone = 5f; // 조준시 깜빡임을 피하기 위한 최소 확정 앵글 public float speedDampTime = 0.4f; // 속도 댐핑 시간 public float angularSpeedDampTime = 0.2f; // 각속도 댐핑 시간 public float angleResponseTime = 0.2f; // 각속도 안에서 각도 회전에 따른 반응 시간 [Header("Cover")] public float aboveCoverHeight = 1.5f; // 장애물에 숨었을 때 고려해야할 최소높이값 public LayerMask coverMask; // 장애물 레이어마스크 public LayerMask shotMask; // 사격 레이어마스크. public LayerMask targetMask; // 타겟 레이어마스크. }
위의 CreateAssetMenu 함수를 통해 생성된 메뉴를 볼 수 있으며, 이를 클릭합니다.
생성된 파일 이름을 EnemyCommonStats라고 지정하고, 우측의 Inspector에 설정값들을 적용해 줍니다.
EntityTable을 클릭해보면 엑셀 파일이 열리는데 무기에 대한 설정값들이 적용되어 있는 것을 볼 수 있습니다.
EntityTable에서 우클릭하여 "XLS Import Settings..."를 클릭합니다. 그러면 엑셀 파일을 읽어서 보여주는 ExcelImporterMaker 창이 나타납니다.
AimOffset 값을 Float으로 설정하고 불필요한 것의 [ ]enable을 꺼주는 등의 설정을 해주고, [create] 버튼을 클릭합니다.
EntityTable에서 다시 우클릭하여 Reimport를 클릭하여 줍니다.
그러면 위와 같이 EntityTable 데이터 셋이 생성된 것을 확인할 수 있습니다.
복잡한 듯 하지만 엑셀을 잘 활용하여 다양한 데이터들을 처리하는 것이 여러가지 확장성에서 좋다라고 보면 됩니다.
사실 엑셀은 이제 실무에서 어떠한 형태로는 사용안되는 경우가 없는 듯해요 ^^. 데이터 관리, 로그, 레포팅, 분석 등 정말 다양한 형태로 활용되죠.. ㅎㅎ
Enemy AI 기본 클래스들 생성입니다.
StateMachine 폴더를 만들고, 하위 폴더로 Action, Decision, State, Transition 폴더를 만듭니다. 그리고 각각의 폴더 안애 위와 같이 스크립트들을 미리 생성해 둡니다. 이렇게 한 이유는 어떤 스크립트들이 만들어지고 어떻게 사용될지를 미리 보기 위함입니다.
우선 StateController를 더블클릭하여 코딩을 시작합니다 ^^~ (Enemy AI 기본 클래스 생성을 마치기 위하여 하나 더 진행..)
/// <summary> /// state -> actions update -> transition (decision) check.. /// state에 필요한 기능들. 애니메이션 콜백들.. // 시야 체크, 찾아놓은 엄폐물 장소중 가장 가까운 위치를 찾는 기능. /// </summary> public class StateController : MonoBehaviour { public GeneralStats generalStats; public ClassStats statData; public string classID; // PISTAL, RIFLE, AK
public ClassStats.Param classStats { get { foreach (ClassStats.Sheet sheet in statData.sheets) foreach (ClassStats.Param parm in sheet.list) if (parm.ID.Equals(classID)) return parm; return null; } }
public State currentState; public State remainState; public Transition aimTarget; public List<Transition> patrolWaypoints; public int bullets; [Range(0,50)] public float viewRadius; [Range(0,360)] public float viewAngle; [Range(0,25)] public float perceptionRadius;
[HideInInspector] public float nearRadious; [HideInInspector] public NavMeshAgent nav; [HideInInspector] public int wayPointIndex; [HideInInspector] public maximumBurst = 7; [HideInInspector] public float blindEngageTime = 30f; [HideInInspector] public bool targetInSight; [HideInInspector] public bool focusSight; [HideInInspector] public bool reloading; [HideInInspector] public bool hadClearShot; // before [HideInInspector] public bool haveClearShot; // now [HideInInspector] public int coverHash = -1; // 장애물마다 고유코드가 있어서 캐릭터들이 몰리지 않고 적당한 장애물을 찾도록 하기 위해.. [HideInInspector] public EnemyVariables variables; [HideInInspector] public Vector3 personalTarget = Vector3.zero;