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

 

댓글()

엑셀의 모든 시트를 각각의 csv로 내보내기

유니티 & C#|2020. 7. 12. 19:37
Sub exportSheetsToCSV()
Dim ws As Worksheet
Dim path As String

path = ActiveWorkbook.path & "\" & Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1)
For Each ws In Worksheets
    ws.Copy
    ActiveWorkbook.SaveAs Filename:=path & " " & ws.Name & ".csv", FileFormat:=xlCSVUTF8, CreateBackup:=False
    ActiveWorkbook.Close False
Next
End Sub

엑셀로 된 데이터베이스를 CSV로 변환하여 유니티에서 불러오기에 좋다.

댓글()

유니티 프로젝트 창 아이콘 Custom GUI

유니티 & C#|2020. 6. 30. 00:10
public class GizmoIconUtility
{
	[DidReloadScripts]
	static GizmoIconUtility()
	{
		EditorApplication.projectWindowItemOnGUI = ItemOnGUI;
	}

	static void ItemOnGUI(string guid, Rect rect)
	{
		string assetPath = AssetDatabase.GUIDToAssetPath(guid);
		ItemDefinition item = AssetDatabase.LoadAssetAtPath<ItemDefinition>(assetPath);

		if (item == null ||
			item.Icon == null)
		{
			return;
		}

		rect.height = rect.width;

		EditorGUI.DrawRect(rect, BackgroundColor);
		GUI.DrawTexture(rect, LoadTextureByRarity(item.Rarity));

		var iconRect = new Rect(rect);
		var center = iconRect.center;

		iconRect.width = rect.width * 0.75f;
		iconRect.height = rect.height * 0.75f;
		iconRect.center = center;

		GUI.DrawTexture(iconRect, item.Icon.texture, ScaleMode.ScaleToFit);

		var levelRect = new Rect(rect);
		levelRect.height = 18;

		string type = item.ItemType == ItemType.Weapon ? item.WeaponType.ToString() : item.ItemType.ToString();

		EditorGUI.LabelField(levelRect, $"Lv.{item.ItemLevel} / {type}", EditorStyles.miniBoldLabel);
	}

	static Texture LoadTextureByRarity(ItemRarity rarity)
	{
		switch (rarity)
		{
			case ItemRarity.Common:
				return AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/_Project/Gizmos/Common.png");
			case ItemRarity.Uncommon:
				return AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/_Project/Gizmos/Uncommon.png");
			case ItemRarity.Rare:
				return AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/_Project/Gizmos/Rare.png");
			case ItemRarity.Epic:
				return AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/_Project/Gizmos/Epic.png");
			case ItemRarity.Legendary:
				return AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/_Project/Gizmos/Legendary.png");
			case ItemRarity.Artifact:
				return AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/_Project/Gizmos/Artifact.png");
		}

		return Texture2D.blackTexture;
	}

	private static Color BackgroundColor => EditorGUIUtility.isProSkin
		? new Color32(56, 56, 56, 255)
		: new Color32(194, 194, 194, 255);

EditorApplication.projectWindowItemOnGUI를 통해 프로젝트 창에서 임의로 아이콘을 그려 넣을 수 있다

댓글()

2D 발사체 포물선 이동

유니티 & C#|2020. 6. 20. 20:18
Vector2 position = transform.position;

Vector2 d = destination - position;
float angle = Vector2.SignedAngle(Vector2.right, d.normalized) + 11.25f;

Vector2 p1 = new Vector2(position.x, 0f);
Vector2 d1 = new Vector2(destination.x, 0f);

float r = Vector2.Distance(p1, d1);
float t = Mathf.Tan(angle * Mathf.Deg2Rad);
float h = destination.y - position.y;

float vx = Mathf.Sqrt(Physics2D.gravity.y * r * r / (2.0f * (h - r * t)));
float vy = t * vx;

Velocity = new Vector2(vx, vy);

댓글()

UIElements UXML 정리

유니티 & C#|2020. 2. 24. 11:49
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

C++ Sqrt 알고리즘 함수

C++|2020. 1. 10. 03:29

'C++' 카테고리의 다른 글

Console Project/ 잠시 쉬어갑니다.  (0) 2019.12.15
JSON for Modern C++  (0) 2019.12.14
Console Project/7. TileMap  (0) 2019.12.14
Console Project/6. 키 입력  (0) 2019.12.12
Console Project/5. 문자 출력  (0) 2019.12.10

댓글()

Unity GameObject Pooling

유니티 & C#|2019. 12. 25. 01:07

https://github.com/wakeup5/Unity-GameObject-Pooling

간단히 게임오브젝트 풀을 생성하고 불러올 수 있는 라이브러리이다.

사용방법

// Pool of GameObject
public GameObject original1;

IPool<GameObject> pool = Pool.OfGameObject(original1);
pool.ActivateOne(Vector3.zero, Quaternion.identity);

// Pool of MonoBehaviour
public Monster original2; // public class Monster : MonoBehaviour

IPool<Monster> pool = Pool.OfBehaviour(original2);
pool.ActivateOne();

// Pool of Poolable
public Bullet original3; // public class Bullet : Poolable (: MonoBahaviour)

var instance = Pool.OfPoolable(original3).ActivateOne(); // 바로 호출하여 사용 가능
instance.Pool; // Pool에 접근 가능.
instance.Original; // Original Prefab에 접근 가능.

// for RectTransform
public Text floatingDamage;
public RectTransform uiParent;

var pool = Pool.OfBehaviour(floatingDamage, uiParant); // create objects on RectTransform;
pool.ActivateOne();

댓글()

Hyper Block Breaker Black&White

게임 포트폴리오|2019. 12. 24. 20:37

레이저를 발사하여 흰색 블록과 검은 색 블록을 번갈아 가며 파괴하십시오.

Each time the turn changes, the color of the laser changes.
Fire a laser to alternate white blocks and black blocks to destroy them.

 

https://play.google.com/store/apps/details?id=me.waker.hbbbw

'게임 포트폴리오' 카테고리의 다른 글

[Unity] Desert Sniper  (0) 2016.01.31
[Unity] Fall in the hole  (0) 2016.01.31
[Unity] Acace 로봇 대전 게임  (0) 2016.01.31
[3D DirectX3D] 검은사막  (0) 2016.01.31
[2D API]The war? 더워!  (0) 2016.01.31

댓글()