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

2024년 8월 11일 일요일

하나의 GameObject에 DOTweenAnimation 여러개 사용 방법

 Unity에서 DOTweenAnimation 을 사용하여 두 개의 애니메이션이 있을 때, 그 중 하나만 동작시키려면 각 애니메이션을 개별적으로 제어해야 합니다.


GPT에 문의해보니 엉뚱한 답을 가르쳐 줘서 구글링해서 찾아냈습니다.


ID를 이용 하면 됩니다. 하나는 ID:1 로 하고 다른 하나는 ID:2를 사용하였습니다.



ById 라는 함수가 준비되어 있습니다. 아래와 같이 string으로 ID값을 넘겨주면 됩니다.
아래는 작업된 코드 입니다.

    public void Attack()

    {        

        DOTweenAnimation ani;

        ani = GetComponent<DOTweenAnimation>();

        if (ani != null)

        {

            ani.DORestartById("1");

        }

    }

    public void FadeOut() 

    {

        DOTweenAnimation ani;

        ani = GetComponent<DOTweenAnimation>();

        if (ani != null)

        {

            ani.DORestartById("2");

        }

    }





2024년 7월 20일 토요일

unity UI Particle 소개

 최근 개발중인 작품에서 UI에서 파티클 출력하는 부분이 필요해서 조사해 보았습니다.

대부분의 파티클들이 UI 모드에서는 나오지 않는 편이 많았는데 그중에 아래 링크의 오픈소스로된 부분을 참고해서 작업을 하였습니다. 

그럼 소개입니다.

https://github.com/mob-sakai/ParticleEffectForUGUI

그중에서도 가장 필요한 기능이었던 특정 target으로 파티클이 이동하는 기능이 필요했는데 해당 기능도 여기에서 UIParticleAttractor 라는 스크립트로 제공을 하였습니다.

Component: UIParticleAttractor

UIParticleAttractor attracts particles generated by the specified ParticleSystem.

 

설치

설치하는 방법은 해당 게시물에 아래부분 참고 부탁드립니다.

OpenUPM을 설치해야 하는데 npm 설치가 필요한데 npm을 설치하려면 node.js 설치가 필요합니다.

  • This package is available on OpenUPM package registry.
  • This is the preferred method of installation, as you can easily receive updates as they're released.
  • If you have openupm-cli installed, then run the following command in your project's directory:
    openupm add com.coffee.ui-particle

    정리하자면, Node.js (npm이 포함됨) -> npm install -g openupm-cli -> cd 작업 폴더 -> openupm add com.coffee.ui-particle 이런 순서로 설치합니다.

    중간에 작업 폴더로 이동해서 설치가 필요합니다.

    아래 링크 다른 패키지 설치하는 예제인데 참고 하시면 됩니다.

    https://openupm.com/#get-started-with-cli-optional


    설치가 완료되면 예제가 없어서, 다시 github demo https://github.com/mob-sakai/ParticleEffectForUGUI/tree/main/Samples~ 이 파일만 받아서 ~를 제거하고 Asset 폴더에 넣어서 실행을 했습니다.


    UIParticleAttractor 

    타겟이 되는 object에 UIParticleAttractor을 추가해 줍니다. 자세한건 예제를 보시면 됩니다.









    2024년 7월 8일 월요일

    Unity Hold on 에서 (hang) 멈추는 현상

     유니티를 실행하다 보면 가끔 아래와 같이 Hold on 에서 무한 대기하는 경우가 있습니다.



    원인이 다양하겠지만, 가장 유력한 범인은 ... 바로 당신입니다.

    가장 최근에 추가한 모듈이나 소스를 의심하시기 바랍니다.

    저 상태에서 다음 상태로 안 넘어 가는 원인 중 하나는 Update() 루틴이 수행되지 못하고 있기 때문입니다.

    어제밤 이 문제로 구글링 하면서 Unity 여러 버전 삭제도 해보고 antivirus 프로그램 중지도 해보았으나 전혀 효과가 없었습니다.

    Start() 함수에 최근에 특별히 추가된 코드가 없는지 확인해보기 바랍니다. 어딘가에서 무한 루프에 빠져 있거나 무한 메모리 증식중일 수 있습니다.

    저의 경우는 Start() 함수에 의해 발생한 현상이었습니다.


    2024년 4월 12일 금요일

    Unity 안드로이드 환경에서의 (adb 없이)효과적인 디버깅 방법

     

    가끔씩 PC 환경과는 다르게 안드로이드에서 애플리케이션이 제대로 동작하지 않는 경우가 있습니다. 이때는 로그를 보면서 디버깅을 진행해야 합니다.

    아래는 adb가 없을때 삼성 휴대폰에서 정리한 안드로이드 환경에서 Unity 애플리케이션을 디버깅하는 방법입니다.


    1. 문제가 의심되는 위치에 다음과 같은 형태로 로그를 추가합니다.

      Debug.Log("bgmEffect null");
      
    2. 휴대폰용으로 APK 빌드를 하여 문제를 재현합니다.

    3. ADB 프로그램이 있다면, 아래의 과정을 수행하지 않아도 됩니다. 그렇지 않은 경우에는 다음과 같은 절차를 따릅니다.

      *#9900#  화면 (두번째 메뉴 Run dumpstate/logcat, 다섯번째 Copy to sdcard 실행)

      • 휴대폰의 *#9900# 덤프 획득 모드로 진입
      • Run dumpstate/logcat 실행
      • Copy to sdcard 메뉴 실행
    4. 휴대폰을 PC와 연결한 후 log 폴더를 찾아서 dumpstate_모델명_날짜.log 파일을 PC로 복사합니다.

    5. 편집기 프로그램을 열고 "Unity :"로 검색합니다.

    6. 이렇게 로그를 확인하면 call stack이 나옵니다.

    7. 04-12 21:57:16.992 10610 31520 31564 I Unity   : bgmEffect null
      04-12 21:57:16.992 10610 31520 31564 I Unity   : GameManager:FadeOutToScene(String)
      04-12 21:57:16.992 10610 31520 31564 I Unity   : UnityEngine.Events.UnityEvent:Invoke()
      04-12 21:57:16.992 10610 31520 31564 I Unity   : UnityEngine.EventSystems.ExecuteEvents:Execute(GameObject, BaseEventData, EventFunction`1)
      04-12 21:57:16.992 10610 31520 31564 I Unity   : UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchPress(PointerEventData, Boolean, Boolean)
      04-12 21:57:16.992 10610 31520 31564 I Unity   : UnityEngine.EventSystems.StandaloneInputModule:ProcessTouchEvents()
      04-12 21:57:16.992 10610 31520 31564 I Unity   : UnityEngine.EventSystems.StandaloneInputModule:Process()
      


    8. 로그를 활용하여 필요한 경우 더 많은 곳에 로그를 추가하고 위의 절차를 반복하여 문제를 해결합니다.


    이와 같은 방법을 통해 안드로이드 환경에서 Unity 애플리케이션의 문제를 신속하게 해결할 수 있습니다.





    2024년 4월 10일 수요일

    Unity에서 데이터 저장 최적화하기: 중복 저장 방지


    Unity에서 데이터 저장 최적화하기: 중복 저장 방지

    Unity 게임 개발 중, 플레이어의 진행 상황, 설정, 또는 게임 데이터를 저장하는 것은 필수적입니다. 하지만, 불필요하게 같은 데이터를 반복해서 저장하는 것은 효율적이지 못합니다. 이 글에서는 저장 전에 기존에 저장된 데이터와 내용이 같은지 비교하여, 같다면 저장하지 않는 방법을 소개합니다.


    저장 데이터 비교 로직

    먼저, 저장할 데이터와 기존에 로드된 데이터를 비교하는 함수 CompSaveData를 사용합니다. 이 함수는 SaveDataStruct 타입의 두 데이터 객체를 매개변수로 받아, 내부적으로 BinaryFormatter를 사용하여 객체를 바이트 배열로 직렬화한 후, 두 바이트 배열이 서로 같은지를 비교합니다.

    csharp

    private static bool CompSaveData(SaveDataSturct data1, SaveDataSturct data2)
    {
        BinaryFormatter formatter1 = new BinaryFormatter();
        BinaryFormatter formatter2 = new BinaryFormatter();
        byte[] bytes1;
        byte[] bytes2;
        using (MemoryStream m = new MemoryStream())
        {
            formatter1.Serialize(m, data1);
            bytes1 = m.ToArray();
        }
        using (MemoryStream m = new MemoryStream())
        {
            formatter2.Serialize(m, data2);
            bytes2 = m.ToArray();
        }
        return bytes1.SequenceEqual(bytes2);
    }
    


    데이터 저장 최적화

    저장할 데이터가 기존에 저장된 데이터와 다를 때만 데이터를 저장하는 로직을 구현합니다. 이를 위해, 먼저 기존의 데이터를 로드하고, 로드된 데이터가 없거나 (loaddata==null) 로드된 데이터가 있지만 현재 데이터와 다른 경우 (!CompSaveData(tempData, loaddata))에만 새로운 데이터를 저장합니다.

    csharp

    var loaddata = LoadData();
    if ((loaddata==null) || (loaddata != null && !CompSaveData(tempData, loaddata)))
    {
        WriteSaveDataToDisk(tempData);
        saveData = tempData;
    }
    


    데이터 저장 함수

    데이터를 저장하기 위한 WriteSaveDataToDisk 함수는 BinaryFormatter를 사용하여 데이터를 직렬화하고, 지정된 경로에 파일로 저장합니다. 이 과정에서 데이터가 실제로 디스크에 기록되는 경로를 로그로 남겨, 디버깅에 도움을 줍니다.

    csharp

    private static void WriteSaveDataToDisk(SaveDataSturct data)
    {
        BinaryFormatter formatter = new BinaryFormatter();
        string path = Application.persistentDataPath + "/game.savegame";
        FileStream stream = new FileStream(path, FileMode.Create);
        formatter.Serialize(stream, data);
        stream.Close();
        Debug.Log("Data saving path : " + path);
    }
    


     




    2024년 4월 7일 일요일

    Unity 프로젝트 의존성 관리와 리소스 복사


    Unity 프로젝트 의존성 관리와 리소스 복사


    Unity 프로젝트를 진행하면서 외부 프로젝트를 가져오거나 Package Manager를 통해 다양한 리소스를 사용하게 되는 경우, 의존성(dependency) 관리에 어려움을 겪을 수 있습니다. 이를 해결하기 위한 몇 가지 방법을 소개합니다.


    Select Dependencies 사용하기

    • 기능 설명: 프로젝트 내에서 특정 폴더를 선택한 후, 오른쪽 마우스 클릭 메뉴에서 'Select Dependencies'를 선택하면, 해당 폴더가 의존하고 있는 모든 파일들의 목록을 볼 수 있습니다. 이를 통해 어떤 파일들이 실제로 사용되고 있는지 파악할 수 있습니다.
    • 장점: 사용 중인 의존성 파일들을 한눈에 확인할 수 있으며, 파일을 클릭하면 상세 내용을 볼 수 있습니다.

    Export Package 사용하기

    • 기능 설명: 'Export Package' 메뉴를 사용하면, 필요한 리소스만을 선택하여 Tree 형태로 확인할 수 있습니다. 이를 통해 불필요한 파일들을 쉽게 식별하고 삭제할 수 있습니다. 
    • 장점: 폴더 단위로 불필요한 파일들을 편리하게 삭제할 수 있으며, 프로젝트의 의존성을 보다 명확하게 관리할 수 있습니다.

    Unity 프로젝트를 관리하면서 의존성 문제를 해결하는 것은 프로젝트의 효율성과 유지보수성을 높이는 데 중요합니다. 'Select Dependencies'와 'Export Package' 기능을 적절히 활용하여, 프로젝트의 의존성을 체계적으로 관리해 보세요. 🙂





    2024년 3월 21일 목요일

    Unity Text scroll credits 만들기

     Unity로 Text가 위로 스크롤 되는 credits 입니다.

    완성된 영상 입니다.


    동작 원리

    텍스트 스크롤 영역을 정하고 그곳에 텍스트를 주기적으로 갱신합니다.
    스크롤은 Update에서 적절히 진행하며 특정 크기(텍스트 높이)만큼 스크롤이 되면 한줄을 추가하고 스크롤된 만큼 다시 스크롤 영역을 빼서 내려줍니다. 
    모든 텍스트가 스크롤 되어 올라갈때까지 이 과정을 반복합니다.

    소스 코드

    https://drive.google.com/file/d/1XnTsYZyoe1uWSm1CW4SVWuKI_TBQg3KV/view?usp=sharing


    조정 인자


    MaxLinesOnScreen

    화면에 Text가 몇 줄이 나타나는지 나타내는 숫자

    Text 폰트나 화면 크기에 따라 화면에 표시되는 글자의 수가 다르므로 적절히 변경해야합니다.

    줄 수를 알 수 있도록 Credits_Text 에 숫자를 넣어 놓았습니다. 여기에서는 25줄입니다만 더 작을 수도 늘어날 수도 있습니다.

    CreditsFile

    text 형태로 된 파일

    LineHeight

    텍스트의 높이

    ScrollSpeed

    스크롤 속도



    2024년 3월 16일 토요일

    OnScreen Controls not working correctly in Unity

     

    Unity On Screen 사용시 컨트롤이 되지 않는 문제

    증상은 

    Player Input에 Auto-Switch off 상태에서 Debug 모드상 Keyboard&Mouse 가 고정되어 On screen game pad를 사용할 수 없는 증상


    댓글에 유사 증상 언급이 있음

    On Screen Controls not working correctly. - Unity Forum


    해결 방법

    Runtime에서 Player Input 컴포넌트를 disable/enable 했을때 정상적으로 동작되는지 확인 필요


    정상 동작된다면 Player Input 컴포넌트를 off된 상태에서 시작해서 Start에서 enable 해줍니다.

    다음과 같은 형태로 start 시 enable 시켰음
    void Start()
    {
    PlayerInput playerInput = GetComponent<PlayerInput>();
    playerInput.enabled = true;
    }





    2024년 3월 10일 일요일

    Vector2 Serialize 할때 오류 발생하는 경우

    Unity에서 Vector2 Serialize 를 사용하게 되면 아래와 같은 오류가 발생합니다.

    SerializationException: Type 'UnityEngine.Vector2' in Assembly 'UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

    아래와같은 Vector2S 와 같은 Class로 변경해주면 사용이 가능합니다.

    Vector2 로 된 변수를 Vector2S 에 넣는 것이 가능하기 때문에 Serialize 하는 변수를 Vector2S 변경하고 Vector2 값을 Vector2S 로 복사 하게끔 구현해주면 됩니다.


    [Serializable]
    public struct Vector2S
    {
    public float x;
    public float y;
    public Vector2S(float x, float y)
    {
    this.x = x;
    this.y = y;
    }
    public override bool Equals(object obj)
    {
    if (!(obj is Vector2S))
    {
    return false;
    }
    var s = (Vector2S)obj;
    return x == s.x &&
    y == s.y;
    }
    public Vector2 ToVector2()
    {
    return new Vector2(x, y);
    }
    public static bool operator ==(Vector2S a, Vector2S b)
    {
    return (a.x == b.x) && (a.y == b.y);
    }
    public static bool operator !=(Vector2S a, Vector2S b)
    {
    return (a.x != b.x) || (a.y != b.y);
    }
    public static implicit operator Vector2(Vector2S x)
    {
    return new Vector2(x.x, x.y);
    }
    public static implicit operator Vector2S(Vector2 x)
    {
    return new Vector2S(x.x, x.y);
    }
    }