안녕하세요

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


페이지 목록

2025년 12월 25일 목요일

[유니티][Unity][C#] as를 이용한 형변환

 IHpBarView hpBar = aView;


BossView bossView = hpBar as BossView;


if(bossView != null)
{ //bossView function 호출

   bossView.Die();
}

else

{
       Debug.LogWarning("이 뷰는 BossView가 아님");

}


이렇게 as 를 통해서 IHpBarView를 상속받는 BossView 형으로 변환 시킬 수 있다.


제미나이를 참조하여 만들었습니다.

2025년 12월 17일 수요일

LMAdSize.h 를 찾을 수 없다는 에러가 발생했을 때 해결 방법

유니티에서 iOS 빌드를 했을 때 .xcodeproj 로 열면 발생하는 이슈이다.

xcodeproj는 내부적인 코드만을 사용하기 때문에 외부 요소들을 배제하여 빌드하기 때문에 외부에 대한 코드를 가져오지 못해서 발생한다.

 그래서 .xcworkspace를 열어야 한다.


 그런데 보면 xcworkspace가 보이지 않을 수 있다. 이 때 해당 프로젝트에 Podfile 이 만들어졌는지 확인 해보자. 이게 없다면 나도 해결방법을 알지못하는데 이게 있다면 문제는 해결할 수 있다

podfile은 "애드몹이랑 광고를 돌리려면 A,B,C라는 파일들이 필요해" 라는 명단이 적혀 있다. 그런데 이걸 실제로 설치하려면 pod install을 돌려야 한다. 이걸 자동으로 돌리게 되있는데 iOS 환경이 복잡하여 이걸 실행 못하는 상황이 발생한다. 이럴 때 수동으로 pod install을 입력해서 수동 설치를 해줘야 한다.


 이렇게 pod install을 하면 xcodeproj에 이런 외부 부품들을 결합하여 xcworkspace를 만들어 주게 된다. 

 

결론: xcworkspace를 열어서 빌드하면 된다. 그런데 이게 없다면 podfile이 있는지 확인해 보고 있다면 해당 폴더에서 pod install을 하여 xcworkspace를 만들어 실행하면 된다.


 제미나이의 도움을 받아 작성하였습니다.

2025년 12월 15일 월요일

other.TryGetComponent(out var damageableTarget) 이란

충돌한 다른 게임 오브젝트에 특정 컴포넌트가 있는지 확인하고, 있다면 해당 컴포넌트의 참조를 안전하게 가져오는 역할을 함


 TryGetComponent<T>(out T component)

 <T> 에 대한 컴포넌트를 찾으라는 것 여기서 이번에는 T가 IDamagable임

Try를 붙여 시도한다는 것이다. 찾으면 true, 못찾으면 false를 반환하고 에러를 발생시키지 않음


out T Component(out var damageableTarget)

out 은 찾은 컴포넌트의 참조를 이 변수에 담아서 반환하라는 의미임

var damageableTarget : 컴포넌트를 찾으면 참조가 저장될 새 변수를 선언하고 이름이 damageableTarget이라는 뜻


즉, IDamagable을 구현한 컴포넌트가 other에 있는지 확인하고 있으면 damageableTarget 변수에 그 컴포넌트 정보를 담아주고 찾았는지 못 찾았는지 알려달라는 것이다.


제미나이의 도움을 받아 작성하였습니다.

 

2025년 12월 14일 일요일

[유니티][Unity] 볼과 보스가 맞았을 때 OntriggerEnter 처리하는 위치 결정

 결론적으로 볼에서 처리하는게 좋다.

 볼이 날라가서 부딪히면 데미지를 준다는 로직에 맞고

보스가 처리하게 되면 보스가 볼만 맞는게 아니고 레이저도 맞고 미사일도 맞는다면

보스가 일일이 이게 볼인지 레이전지 처리를 해줘야 되서 복잡성이 올라가게 된다.


구글 제미나이의 도움을 받아 작성하였습니다.

[유니티][Unity][C#] If ... is ... ... 과 (... as ...)?.Function() 에 대하여

 IMainCharAttackView Interface와

MainCharAttackView: ImainCharAttackView 로 인터페이스를 상속받는 class가 있을때


IMainCharAttackView _view;


MainCharAttackPresenter(IMainCharAttackView view)
{

  _view = view;

}


로 되어 있을 때 이런 식으로 사용하게 된다.


if( _view is MainCharAttackView concreteView)

   concreteView.function();

}

  이 뜻은 _view가 MainCharAttackView 라면 concreteView에 _view를 할당해서 쓰라는 것이다.

 그래서 MainCharAttackView의 function을 concreteView가 사용하게 된다.


사실은 _view가 이미 MainCharAttackView 타입이기에 그냥 써도 되지만 이런 if문을 씀으로 인해서 정확하게 MainCharAttackView 형임을 확인하고 명확하게 concreteView를 통해 안정적으로 실행하게 된다.


(_view as MainCharAttackView)?.Function() 은

 _view를 MainCharAttackView형으로 바꿨을 때 된다면 Function을 실행하고

형이 안 맞으면 null값을 반환하라는 뜻이다.


 Google AI의 도움을 받아 작성하였습니다.


2025년 12월 6일 토요일

[유니티][Unity] 보스HP와 주인공HP를 계산하는 방법이 같을 때 하나의 코드로 처리하는 방법

  보스HP가 애니메이션 효과로 줄어들게 구현하고 보니 

 (7가지 색의 SingleBar 를 만들고 curHpBar는 빨주노초파남보 라면 

 밑에 있는 BelowHpBar는 주노초파남보빨 로 나오게 하고

 curHpBar가 Singlebar의 끝까지 가면 주황이나오고 belowHpBar는 노랑이 나오도록 설계하고

이를 루프를 돌리고 마지막에 hp가 0이 될 때는 검은색으로 나오게 만들었다.)


 이 것을 보스에만 구현해놓고 이제 주인공 HP에 구현하려고 보니, 이 코드를 다시 만들어야 되는 것이다. 

 그래서 재사용할 수 있게 만들어 보니 몇가지 테크닉이 들어가게 되었다.


 1. static class를 지정한다.

  사용 이유를 정확하게는 알 수 없으나 공용으로 쓰이는 메소드를 static class에 넣어 쓰면 재사용하기에 좋다고 한다.

 이 경우에 GetColorByBarIndex로 7가지 색중 어느 index를 불러와야 할지 정하는 메소드를 static으로 만들어서 공용으로 컬러 값을 가져올 수 있게 하였다.

public static class HpColorHelper

{

    public static Color GetColorByBarIndex(int index, List<Color> barColors, Color depletedColor)

    {

        if (index < 0) return depletedColor;

        if (barColors == null || barColors.Count == 0) return Color.white;

        return barColors[index % barColors.Count];

    }

}


2. baseHpView를 만들어 거기에 색깔 계산과 애니메이션효과와 현재피/전체피 텍스트를 적게 했다.

 이렇게 하면 bassHpView를 상속받으면 bassHpView에서 로딩하는 UpdateHpBar(...) 클래스를 

가져오게 되니 한번 만든 코드를 재사용할 수 있게 되었다.


3. Interface를 사용하여 Presenter에서 view를 가져온다.

 아직 정확하게 감이 잡힌 건 아닌데 interface를 쓰면 Presenter에서 view가 바뀌어도 코드 바꿀 필요가  없어서 유연성이 증가된다고 한다. 

이런 식으로 interface를 선언 하고

public interface IHpBarView

{

    void UpdateHpBar(int currentHp, int maxHp);

}

Interface를 상속 받아 같은 구조로 된 메소드에 구현 한다.

using UnityEngine;

using UnityEngine.UI;


public class BaseHpBarView : MonoBehaviour, IHpBarView

{

    [SerializeField] private Image hpImage;


    // 인터페이스 메서드 구현 → 반드시 public

    public void UpdateHpBar(int currentHp, int maxHp)

    {

        float ratio = (float)currentHp / maxHp;

        hpImage.fillAmount = ratio; // 단순 예제

    }

}


그러면 하위 클래스는 코드 없이 사용가능하다.

public class BossHpBarView : BaseHpBarView

{

    // IHpBarView 다시 구현할 필요 없음

    // 필요 시 UpdateHpBar override 가능

}


public class MainCharHpBarView : BaseHpBarView

{

    // 특화 로직 override 가능

}


Presenter에서 호출 할 떄는 아래와 같이 쓴다.

public class HpBarPresenter : MonoBehaviour

{

    private IHpBarView view;

    private int currentHp = 100;

    private int maxHp = 100;


    // Init 메서드로 런타임에 View 주입

    public void Init(IHpBarView view)

    {

        this.view = view;

        view.UpdateHpBar(currentHp, maxHp); // 초기화

    }


    public void TakeDamage(int dmg)

    {

        currentHp = Mathf.Max(0, currentHp - dmg);

        view.UpdateHpBar(currentHp, maxHp);

    }

}


 핵심은 IHpBarView를 넘겨받아 쓴다는 것이다. 그래서 baseView던지 boss던지 mainchar던지 상관없이 view를 넘겨 받을 수 있다는 게 핵심으로 보인다.


 chatGPT의 도움을 받아 작성하였습니다.

[유니티][Unity] Color 값을 메인케릭터와 보스가 같이 공유해서 사용하는 방법

 ScriptableObject를 통해 만들어진 컬러 값을 가져와서 사용하면 된다.

아래 코드 같이 만든 후 사용한다.


using NUnit.Framework;

using UnityEngine;

using System.Collections.Generic;


[CreateAssetMenu(menuName = "UI/HP Color Config")]

public class HpColorConfig : ScriptableObject

{

    public List<Color> hpBarColors;

    public Color animatedBarColor;

    public Color depletedHPColor = Color.black;    

}


CreateAssetMenu를 통해 UI  -> HP Color Config라는 메뉴가 생겼다.


Project의 Assets 폴더에서 Create -> UI -> HP Color Config를 누르면 생기는데 그 이름을 HP Color Config로 저장하자. 이것을 HP Color Config Asset이라 한다. 그걸 눌러보면 위에 선언한 Color 값들을 Inspector에서 조절할 수 있다. 이렇게 만들어 놓은 값들을 사용하기 위해 사용하려는 곳에 가서 

    [Header("Config")]

    [SerializeField] private HpColorConfig colorConfig;

로 선언하고 이 colorConfig 값에 만들어 놓은 HP Color Config Asset을 넣으면 연동이 된다.

 그 후 colorConfig.hpBarColors[index] 라는 식으로 사용하면 된다.


 chatGPT의 도움을 받아 작성하였습니다.