안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

레이블이 chatGPT인 게시물을 표시합니다. 모든 게시물 표시
레이블이 chatGPT인 게시물을 표시합니다. 모든 게시물 표시

2024년 12월 27일 금요일

[유니티][Unity][chatGPT] Unity2D에서 MVC로 구현한 보스가 주인공 위치에 원형의 범위기술을 사용 후 Duration시간 뒤에 터지는 기술

 Unity 2D에서 MVC(Model-View-Controller) 패턴으로 보스가 주인공 위치를 기준으로 원형 범위 공격을 수행하는 시스템을 설계하는 코드이다. MVC 패턴은 코드의 분리를 통해 가독성과 유지보수성을 높이는 것을 목표로 한다.



MVC 구조

  1. Model:

    • 데이터 및 로직을 처리합니다.
    • 스킬 반경, 경고 시간, 데미지 값 등을 관리.
  2. View:

    • 사용자에게 보여지는 경고 UI와 스킬 효과를 처리합니다.
    • 경고 UI 생성, 스킬 효과 표시 등을 담당.
  3. Controller:

    • 사용자 입력이나 로직의 흐름을 관리합니다.
    • 보스의 행동을 제어하고 Model과 View를 연결.

1. SkillModel (Model)

스킬 데이터를 관리하고 범위 내 타겟을 감지하는 로직을 구현합니다.

csharp
using UnityEngine; public class BossSkillModel { public float Radius { get; private set; } public float Damage { get; private set; } public float WarningDuration { get; private set; } public BossSkillModel(float radius, float damage, float warningDuration) { Radius = radius; Damage = damage; WarningDuration = warningDuration; } // 범위 내 타겟 감지 public Collider2D[] GetTargets(Vector2 position, LayerMask targetLayer) { return Physics2D.OverlapCircleAll(position, Radius, targetLayer); } }

2. SkillView (View)

스킬의 시각적 요소를 관리합니다.

 - 경고 UI 프리팹에 임의로 그림판으로 작성한 원을 넣어 주고, 스킬 효과 프리팹은 아직 작성하지 않았다. (스킬 효과 프리팹은 주석 처리해도 동작한다)

csharp
using UnityEngine; public class BossSkillView : MonoBehaviour { public GameObject WarningPrefab; // 경고 UI 프리팹 public GameObject EffectPrefab; // 스킬 효과 프리팹 private GameObject warningInstance; // 경고 UI 표시 public void ShowWarning(Vector2 position, float radius) { warningInstance = Instantiate(WarningPrefab, position, Quaternion.identity); warningInstance.transform.localScale = new Vector3(radius * 2, radius * 2, 1); } // 경고 UI 제거 public void HideWarning() { if (warningInstance != null) { Destroy(warningInstance); } } // 스킬 효과 표시 public void ShowSkillEffect(Vector2 position, float radius) { GameObject effect = Instantiate(EffectPrefab, position, Quaternion.identity); effect.transform.localScale = new Vector3(radius * 2, radius * 2, 1); } }

3. BossController (Controller)

보스의 행동을 관리하고 Model과 View를 연결합니다.

 - BossSkillController가 아니라 BossController인 이유는 보스가 사용하는 스킬이기 때문이고, 작은 프로젝트의 경우 BossSkillController를 따로 구분 하지 않고 하나의 BossController에서 사용해도 감당 가능하기에 BossController를 사용한다. 

   감당이 안된다면 BossSkillController를 별도로 만들어 사용해도 된다.

csharp
using UnityEngine; public class BossController : MonoBehaviour { public Transform player; // 주인공 Transform public LayerMask targetLayer; // 타겟 레이어 public SkillView skillView; // 스킬 View private SkillModel skillModel; // 스킬 데이터 void Start() { // Model 초기화 skillModel = new SkillModel(radius: 5.0f, damage: 50.0f, warningDuration: 2.0f); } public void StartSkill() { if (player == null) { Debug.LogError("Player가 설정되지 않았습니다!"); return; } // 주인공 위치 저장 Vector2 targetPosition = player.position; // View를 통해 경고 UI 표시 skillView.ShowWarning(targetPosition, skillModel.Radius); // 일정 시간 후 스킬 발동
StartCoroutine(ActivateSkillAfterDelay(targetPosition, bossSkillModel.WarningDuration)); }

    IEnumerator ActivateSkillAfterDelay(Vector2 targetPosition, float delay)     {     yield return new WaitForSeconds(delay);      ActivateSkill(targetPosition);     } private void ActivateSkill(Vector2 targetPosition) { // View에서 경고 UI 제거 skillView.HideWarning(); // View에서 스킬 효과 표시 skillView.ShowSkillEffect(targetPosition, skillModel.Radius); // Model을 통해 범위 내 타겟 감지 Collider2D[] hitTargets = skillModel.GetTargets(targetPosition, targetLayer); foreach (var target in hitTargets) { target.GetComponent<Health>()?.TakeDamage(skillModel.Damage); } Debug.Log("스킬 발동 완료!"); } }

4. Health (Model)

주인공이나 다른 타겟이 데미지를 받을 수 있도록 체력을 관리합니다.

csharp
using UnityEngine; public class Health : MonoBehaviour { public float MaxHealth = 100f; private float currentHealth; void Start() { currentHealth = MaxHealth; } public void TakeDamage(float amount) { currentHealth -= amount; Debug.Log($"{gameObject.name} 남은 체력: {currentHealth}"); if (currentHealth <= 0) { Die(); } } private void Die() { Debug.Log($"{gameObject.name} 사망"); Destroy(gameObject); } }

5. Unity 설정

1) 보스 설정

  1. Boss GameObject에 **BossController**와 SkillView 스크립트를 추가.
  2. SkillView 설정:
    • WarningPrefab과 EffectPrefab을 연결.
  3. BossController 설정:
    • 주인공의 Transform을 Player 필드에 연결.
    • TargetLayer에 적합한 레이어 설정(예: "Player").

2) 주인공 설정

  1. 주인공 GameObject에 Health 스크립트 추가.
  2. Inspector에서 MaxHealth 값 설정.

3) 경고 및 공격 효과 프리팹

  • WarningPrefab: 원형 이미지 기반 UI.
  • EffectPrefab: 원형 스프라이트 또는 파티클 효과.

6. 테스트

  1. BossController의 StartSkill 메서드를 호출(키 입력으로 테스트 가능).
    csharp
    void Update() { if (Input.GetKeyDown(KeyCode.F)) { StartSkill(); } }
  2. 주인공 이동:
    • 스킬 발동 위치와 데미지 처리가 주인공의 위치에 맞게 동작하는지 확인.

결과

  • 보스는 주인공의 위치를 감지하여 원형 범위 경고를 표시하고, 일정 시간 후 해당 위치에서 스킬을 발동한다.
  • 범위 내에 있는 대상(주인공 포함)은 데미지를 받는다.

MVC 패턴 장점

  1. 코드 분리:

    • 데이터(Model), 시각적 요소(View), 로직(Control)이 독립적으로 관리되므로 유지보수성 향상.
  2. 확장성:

    • 새로운 스킬 View 또는 Model을 쉽게 추가 가능.
  3. 테스트 용이성:

    • 각 컴포넌트를 독립적으로 테스트 가능.

** 이 글은 chatGPT의 도움으로 작성되었습니다.

2024년 12월 26일 목요일

[Copilot][Gemini][ChatGPT] 코파일럿 사용평가 - 코파일럿으로 코딩방법도 알려줘서 신기해서 다른 AI검색도 설치해 보았다

  코파일럿을 통해 코딩 방법에 대해 물어 보면서 웹 검색보다 빠르게 코드까지 보여주면서 알려주는게 신세계를 경험하였다. 예전에 잠시 코파일럿을 써봤을 때 일상적인 이야기에 대해서 물어보면 답변이 그닥 시원찮았기 때문에 별거 없다는 인식이 강했는데, 이번에 게임을 만들어가면서 모르는 걸 물어 봤을 때 MVC 모델이라던지 상속과 다형성 측면에서 접근 한다던지 생각하지도 못했던 길로 가이드를 해주는 게 이 정도까지 알려준다고? 하는 느낌을 지울 수가 없었다. 

 그래서 AI검색에 대해 관심이 가면서 Gemini와 chatGPT 까지 설치하게 되었다. 제미니와 chatGPT도 유사한 수준에서 답변을 제공받을 수 있었기에 3가지를 돌려 가면서 사용하면서 어떤 게 좋은지 좀 더 알아 봐야 겠다.

 이렇게 코딩에 대해 자세히 알려주다보니, 일상 질문들도 해보았는데, 이전에 대비해서 꽤나 상세하게 알려준다는 느낌이였다. 

 AI 검색 이전에는 웹 페이지를 검색해서(구글링) 구글이 보여주는 신뢰도 높은 결과물의 블로그를 들어가서 확인해보는 방식이였다면 AI 검색은 질문하면 답을 바로 보여주기에 빠르다는 느낌이 강하게 들었다.

 그런데 그냥 빠르면 사용하지 않겠지만, 구글링해서 이 블로그를 들어가보고 원하는 답변이 아니면 또 다른 블로그를 찾아 다니는 탐색 과정에서 시간이 많이 소모되게 되는데, AI 답변은 딱 내가 원하는 답을 바로 찾아 주기에 효율성이 좋았고, 물론 그 답변이 항상 정확하게 매칭되는 것은 아니였지만 몇가지 추가 질문을 통해 원하는 대답과 유사한 답변을 얻게 되는 확률이 꽤 높았다. 

 요약하자면, 구글링을 통해 여러 블로그를 뒤적이며 찾아가는 시간이 줄어들고, 질문을 하면 바로 답을 해주는 빠른 속도 + 꽤 상세하고 정확한 답변의 강점이 코딩하면서 모르는 내용을 알아 가는 시간을 많이 줄여준다는 느낌이 들었다. 

 오히려 일상적인 질문 보다 코딩에 대한 질문에 특화 되어있다는 느낌이 들 정도로 코딩 부분에 대한 질문이 더 좋았다는 느낌을 받았다. 물론, 내가 모르는 부분에 대해서 답변을 해줬기 때문에 그 내용을 좀 더 깊이 습득하면 AI의 결과가 꼭 맞지는 않았다는 걸 알게될 수도 있겠지만, 잘 모르는 상황에서 질문을 했을 때 그 대답이 꽤나 이대로 하면 구현 되겠는데? 하는 정도로 상세하게 답변을 해준다는 점이 놀라웠다고 하겠다.

 방대한 데이터를 요하는 일상 질문 보다 오히려 특정 타겟팅이 잡히는 코딩이라는 전문 분야에 대해 오히려 학습이 더 쉬웠나? 하는 느낌을 받았다. 

 쓰다보면 이런 얘기를 했다가 다른 식의 질문을 하면 또 그 내용에 대해 답변을 하면서 질문에 따라 답이 조금씩 달라지는 부분은 내가 잘 취사 선택해야 되겠다는 생각은 들었다.