재화 획득 연출(흩뿌리고 타겟 이동 연출)
보상으로 재화를 획득하는 과정에서 시각적인 연출 효과로 인해서 보상을 받는 느낌을 더 주기 위해서
특정위치에서 타겟으로 이동하는 연출을 작업했다.
반응형
구조는 내부에서 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]
★★★☆☆
반응형
'개발 > Unity' 카테고리의 다른 글
Unity) Project Settings의 특정 메뉴 선택하기 (0) | 2024.10.22 |
---|---|
Unity)보로노이 다이어그램 (Voronoi diagram) (0) | 2024.10.19 |
Unity) Debug -Json Pretty Print 적용하기 (0) | 2024.10.10 |
Unity)격투 게임 HP 구현하기 (Recoverable HP :회복 가능 HP) (0) | 2024.10.08 |
Unity) GameObject Active Script로만 제어하기 (5) | 2024.09.30 |
댓글