오늘 배운 내용
- Button 컴포넌트는 EventSystem 이 필요하다.
Button 컴포넌트는 EventSystem 이 필요하다.
카드 오브젝트를 생성하고나서 Button 컴포넌트를 주고 클릭으로 이벤트를 받으려고했는데
아무리 해도 UI 버튼들은 잘 작동하는데 오브젝트에 버튼 컴포넌트를 추가한 것은 작동되지 않았다.
사실 그때 오해를 했던게 다른 버튼들은 다른 씬에 있었기 때문에 EventSystem 오브젝트가 있어서 잘
작동했었고, 메인 씬에는 아직 UI들을 만들기 전이라 버튼이 작동하지 않은것 이였다.
그리고 Canvas 컴포넌트의 Render-Mode WorldSpace로 속한 UI들의 좌표를 World 좌표에 맞춰서 사용할 수 있었다.
파도 타기 기능 구현
카드가 생성될때 파도 타기 효과를 내면서 생성되는 기능을 구현했다.
같은 조원분이 이미 인터페이스를 구성하고 예시로 Spiral 기능을 구현하셔서
참고해서 생각보다 쉽게 만들수 있었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Wave : MoveEffectInterface
{
GameObject mTarget;
float mMaxY;
float mMinY;
bool mDir;
Vector3? mEnd;
Vector3 mStart;
float mSpeedX;
float mSpeedY;
float mDuration;
public bool Run(GameObject _object, Vector3? _start, Vector3? _end)
{
if (mTarget == null)
{
mTarget = _object;
mEnd = _end;
mMaxY = _end.Value.y + 0.03f;
mMinY = _end.Value.y - 0.03f;
mDir = true;
mSpeedX = 1.5f;
mSpeedY = 0.37f;
mDuration = 3.0f;
mTarget.transform.position = new Vector3(_end.Value.x + (mSpeedX - 0.1f) * mDuration , _end.Value.y, 0);
}
mDuration -= Time.deltaTime;
if (mDuration <= 0)
{
Cancel();
return false;
}
mTarget.transform.position = CaculatePosition(mTarget.transform.position);
return true;
}
public void Cancel()
{
mTarget.transform.position = (Vector3)mEnd;
}
public bool IsEnd()
{
if (mDuration <=0) { return false; }
return true;
}
Vector3 CaculatePosition(Vector3 _now)
{
// mDir == true 일떄 위로이동
if (mDir)
{
Vector3 nextPos = new Vector3(_now.x - mSpeedX *Time.deltaTime, _now.y + mSpeedY * Time.deltaTime, 0);
if (nextPos.y < mMaxY)
{
return nextPos;
}
}
else
{
Vector3 nextPos = new Vector3(_now.x - mSpeedX * Time.deltaTime, _now.y - mSpeedY * Time.deltaTime, 0);
if (nextPos.y > mMinY)
{
return nextPos;
}
}
mDir = !mDir;
return _now;
}
}
우리 팀의 효과들은 UIEffectManager의 싱글톤 객체가 전부 관리하기로 정했었고,
그에 따라 인터페이스를 정의해서 맞추었다.
UIEffectManager는 Wave객체를 생성하고 List에 추가해서 Update()문에서 Wave인스턴스.Run()을
계속해서 실행한다.
Run() 에서는 Run()이 처음 실행될 때 Target이 비어있기 때문에 그것을 이용해 필요한 멤버변수들을
초기화 하고 CaculatePosition()를 통해서 객체의 다음 프레임 위치를 계산하여 Wave 인스턴스가
가지고 있는 GameObject의 위치가 최종적으로 변경하고 true를 return 한다.
Run()이 false를 리턴하면 해당 효과의 시간이 끝났으므로 UIEffectManager는 List에서 해당 효과를
제거하여 더이상 위치가 변하지 않는다.
CaculatePosition() 함수는 객체의 방향에 따라서 위나 아래로 y축 이동을 반복하면서 오른쪽에서
왼쪽으로 도착지점까지 계속해서 이동하도록 구현하여서 파도타기 효과를 구현했다.