에디터 스크립트에서 직접 스크립트를 생성하는 방법

유니티 & C#|2021. 3. 10. 16:41
// 코드를 받아 스크립트를 생성하거나 업데이트 하는 함수
private void CreateScript(string path, string code)
{
    File.WriteAllText("Assets/" + path, code);
    AssetDatabase.Refresh();
}

Path와 코드 내용을 입력받아 해당 Path에 스크립트를 생성할 수 있다.

 

다음은 팝업 접근에 용이하도록 MyPopups.cs를 생성하는 에디터 코드이다.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEditor;
using UnityEngine;

namespace Waker.Popups.Editors
{
    [CustomEditor(typeof(PopupController))]
    public class PopupControllerEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            if (GUILayout.Button("Generate MyPopups.cs"))
            {
                PopupController instance = target as PopupController;

                var popups = instance.GetComponentsInChildren<PopupBase>();
                string code = CreateCode(popups);
                CreateScript(code);
            }
        }

        private string CreateCode(IEnumerable<PopupBase> popups)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("using Waker.Popups;");
            sb.AppendLine("// PopupController.cs에 의해 자동으로 생성된 스크립트입니다. 네임스페이스를 추가하거나 에러를 수정하는 등 자유롭게 수정 가능합니다.");
            sb.AppendLine("public static class MyPopups");
            sb.AppendLine("{");

            foreach (var popup in popups)
            {
                string typeName = popup.GetType().Name;
                string popupName = popup.PopupName;
                string propertyName = String.Concat(popupName.Where(c => !Char.IsWhiteSpace(c)));
                sb.AppendLine($"\tpublic static {typeName} {propertyName} => PopupController.Instance.Get<{typeName}>(\"{popupName}\");");
            }

            sb.AppendLine("}");

            return sb.ToString();
        }

		// 코드를 받아 스크립트를 생성하거나 업데이트 하는 함수
        private void CreateScript(string code)
        {
            File.WriteAllText("Assets/MyPopups.cs", code);
            AssetDatabase.Refresh();
        }
    }
    
}

댓글()

BigInteger를 유닛 단위 문자열로 변환하는 함수

유니티 & C#|2020. 12. 27. 00:56

 

댓글()

유니티 UGUI 드래그 앤 드랍

유니티 & C#|2020. 11. 11. 00:21

댓글()

유니티 Android SDK 업데이트

유니티 & C#|2020. 10. 3. 12:24

https://www.youtube.com/watch?v=3Qay9h14swM

댓글()

유니티에서 다국어 폰트 지원하는 방법

유니티 & C#|2020. 10. 1. 15:58

 영어 폰트와 한글 폰트를 각각 적용하고 싶을 경우 둘 중 하나의 폰트를 선택 한 후, 글꼴 이름에서 추가하고자 하는 폰트의 이름을 추가하면 된다.

 

 하나의 Text 컴포넌트에 여러가지 언어의 글자를 입력하면 자동으로 해당 언어를 지원하는 폰트를 적용해준다.

 

 로컬라이징 에셋을 사용할 때 별도로 언어별 폰트를 지정해줄 필요 없이 이 방법을 사용하면 매우 간편하게 다국어를 지원할 수 있다.

댓글()

Pagination of IEnumerable<T>

유니티 & C#|2020. 9. 29. 15:18

 

댓글()

BundleTool - 유니티에서 빌드된 aab 파일을 안드로이드에 설치

유니티 & C#|2020. 9. 20. 14:24

JDK 및 SDK 설치

jdk와 sdk가 설치되어 있어야 하고, JAVA_HOME 환경변수를 등록해야 한다.

BundleTool

aab파일을 디바이스에 설치하기 위해서는 BundleTool이라는 파일이 필요하다. 다운로드 하는 위치는 다음과 같다.

https://github.com/google/bundletool/releases

bundletool을 실행하기 위한 명령어는 다음과 같다.

java -jar "./bundletool-all-1.2.0.jar" --version

apks 빌드

A.aab 파일을 apks파일로 빌드한다. 현재 컴퓨터와 연결된 안드로이드에 맞도록 필터링 하려면 --connected-device 을 추가한다.

java -jar "./bundletool-all-1.2.0.jar" build-apks 
    --connected-device 
    --bundle="A.aab" 
    --output="A.apks" 
    --ks=key.keystore 
    --ks-pass=pass:123456 
    --ks-key-alias="alias" 
    --key-pass=pass:123456 
    --adb="PATH_TO_SDK\\platform-tools\\adb.exe"

설치

빌드된 apks파일을 연결된 안드로이드에 설치한다.

java -jar "./bundletool-all-1.2.0.jar" install-apks 
    --apks="A.apks" 
    --adb="PATH_TO_SDK\\platform-tools\\adb.exe"

실행

adb를 통해 설치된 앱을 안드로이드에서 실행한다.

PATH_TO_SDK\\platform-tools\\adb.exe shell monkey -p "PACKAGE_NAME" -c android.intent.category.LAUNCHER 1

댓글()

RepeatButton 누르고 있는 동안 이벤트가 반복 발생하는 버튼

유니티 & C#|2020. 8. 30. 15:43
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
using UnityEngine.UI;

namespace UI
{
    public class RepeatButton : Selectable, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
    {
        [SerializeField] private float interval = 0.1f;
        [SerializeField] private float delay = 1.0f;
        [SerializeField] private ButtonRepeatEvent onRepeat = new ButtonRepeatEvent();

        private bool isPointDown = false;
        private float lastInvokeTime;
    
        private float delayTime = 0f;
    
        public ButtonRepeatEvent OnRepeat => onRepeat;

        // Use this for initialization
        protected override void Start()
        {
            base.Start();
            delayTime = delay;
        }

        protected override void OnDisable()
        {
            base.OnDisable();
            
            isPointDown = false;
            delayTime = delay;
        }

        void Update()
        {
            if (!IsInteractable() && isPointDown)
            {
                isPointDown = false;
                delayTime = delay;

                return;
            }

            if (isPointDown)
            {
                if ((delayTime -= Time.deltaTime) > 0f)
                {
                    return;
                }
    
                if (Time.time - lastInvokeTime > interval)
                {
                    Repeat();
                    lastInvokeTime = Time.time;
                }
            }
        }

        private void Repeat()
        {
            if (!IsActive() || !IsInteractable())
                return;

            onRepeat.Invoke();
        }

        public virtual void OnPointerClick(PointerEventData eventData)
        {
            if (eventData.button != PointerEventData.InputButton.Left)
                return;

            Repeat();
        }

        public override void OnPointerDown(PointerEventData eventData)
        {
            base.OnPointerExit(eventData);

            isPointDown = true;
            delayTime = delay;

            if (IsInteractable())
            {
                DoStateTransition(SelectionState.Pressed, false);
            }
        }
    
        public override void OnPointerUp(PointerEventData eventData)
        {
            base.OnPointerExit(eventData);

            isPointDown = false;
            delayTime = delay;

            DoStateTransition(currentSelectionState, false);
        }
    
        public override void OnPointerExit(PointerEventData eventData)
        {
            base.OnPointerExit(eventData);

            isPointDown = false;
            delayTime = delay;

            DoStateTransition(currentSelectionState, false);
        }

        [Serializable]
        public class ButtonRepeatEvent : UnityEvent { }
    }
}

댓글()

Power Tools Mega Bundle

유니티 에디터 툴 바에 파워툴 에셋 패키지를 추가해보세요. 빠르고 효과적으로 게임 제작이 가능합니다. 제작 초기단계부터 마무리 단계까지, 강력한 툴 패키지가 게임의 완성도를 높여 줄 것입니다. 향상된 플레이를 위한 강력한 툴들을 지금 만나보세요!

 

클릭하여 해당 페이지로 이동

https://assetstore.unity.com/mega-bundles/power-tools

'유니티 & C# > 유니티 에셋 할인' 카테고리의 다른 글

Save over 90% on our largest Mega Bundles!  (0) 2019.12.18

댓글()

유니티에서 컴파일러 Warning 로그 제거하기

유니티 & C#|2020. 7. 13. 23:26

유니티 컴파일러에서 코드 경고(CS0414, CS0649, CS0618, CS0108 등등)를 콘솔창에 출력하는 바람에 경고창을 끄고 사용하지 않는 때가 많이 있었다. 이를 표시 하지 않는 방법이 있다.

 

Assets 폴더에 csc.rsp파일을 만들고 출력하지 않을 경고를 지정하면 된다.

-nowarn:0414
-nowarn:0649
-nowarn:0618
-nowarn:0108

 

댓글()