본문 바로가기
개발/Unity

Unity) 재화 획득 연출(흩뿌리고 타겟 이동 연출)

by 테샤르 2024. 10. 18.

재화 획득 연출(흩뿌리고 타겟 이동 연출)

 

보상으로 재화를 획득하는 과정에서 시각적인 연출 효과로 인해서 보상을 받는 느낌을 더 주기 위해서

특정위치에서 타겟으로 이동하는 연출을 작업했다.

반응형

구조는 내부에서 Object Pool 을 사용해서 보상에 처리할 적당한 수준의 보상 오브젝트를 초기화해서 만든다.

보상 오브젝트의 재사용성과 보상의 개수에 따라 유동적으로 변화를 해야하는 것에 대해 고려하고 작업진행 했다.

 

< Manager Class  : Pooling Object 주체 >

 

 

Diameter 값을 통해서 처음에 보상오브젝트를 1차적으로 흩뿌려주는 과정이 끝나면

타겟으로 이동한다.

반응형

 

 < Target Move Item >

타켓 오브젝트의 Script 로 Animation Curve를 활용해서 시간의 흐름에 대해서 처리를 진행했다.

 

< Script : TargetMove Item >

using System;

using System.Threading.Tasks;
using UnityEngine;

public class TargetMoveItem : MonoBehaviour
{
	public RectTransform rectTransform
	{
		get
		{
			return transform.GetComponent<RectTransform>();
		}
	}

	[SerializeField]
	private AnimationCurve moveCurve = default; // 이동 시 사용할 애니메이션 곡선

	private Vector2 initPos = Vector2.zero;    // 초기 위치
	private Vector2 circleTarget = Vector2.one; // 원 안에서의 목표 위치

	private GameObject targetObject = default;  // 이동할 타겟 오브젝트

	private Action<TargetMoveItem> endAction = default;

	public TargetMoveItem SetEndAction(Action<TargetMoveItem> _action )
	{
		endAction = _action;
		return this;
	}

	private void Awake()
	{
		initPos = transform.localPosition; // 초기 위치 설정
	}

	// Currency 초기화
	public void Initialize(Vector2 _circleTarget, GameObject _targetObject)
	{
		circleTarget = _circleTarget;     // 원 안에서의 목표 위치 설정
		targetObject = _targetObject;     // 타겟 오브젝트 설정
	}

	public async void Play()
	{
		// 원 내 랜덤 위치로 이동 후 타겟으로 이동
		await MoveCircleTarget();
		await MoveTargetObject();

		endAction?.Invoke(this);
	}

	private float MoveCurveTime => moveCurve.keys[moveCurve.length - 1].time;

	// 원 안에서 랜덤 위치로 이동하는 메서드
	public async Task MoveCircleTarget()
	{
		Vector2 randomPosition = UnityEngine.Random.insideUnitCircle * circleTarget.x / 2f; // 원의 지름 안에서 랜덤 위치
		await MoveToPosition(randomPosition, MoveCurveTime);  // 1초간 랜덤 위치로 이동
	}

	// 타겟 오브젝트로 이동하는 메서드
	public async Task MoveTargetObject()
	{
		if (targetObject != null)
		{
			Vector2 targetPosition = targetObject.transform.localPosition;
			await MoveToPosition(targetPosition, MoveCurveTime);  // 1초간 타겟 오브젝트로 이동
		}
	}

	// 이동을 처리하는 공통 메서드
	private async Task MoveToPosition(Vector2 targetPosition, float duration)
	{
		float timeElapsed = 0f;
		Vector2 startPos = rectTransform.localPosition; // 시작 위치

		while (timeElapsed < duration)
		{
			timeElapsed += Time.deltaTime;
			float t = moveCurve.Evaluate(timeElapsed / duration); // AnimationCurve를 이용한 이동

			MovePosition(Vector2.Lerp(startPos, targetPosition, t));
			await Task.Yield(); // 비동기 처리로 한 프레임 대기
		}

		MovePosition(targetPosition);
	}

	private void MovePosition(Vector2 _targetPosition)
	{
		rectTransform.localPosition = _targetPosition;
	}
}

 

 

[Unity -Top Paid Package]

[Unity -Top Free Package]

[Unity -New Asset Package]

 

★★★☆☆

 

반응형

댓글