📝 24.06.11
🔗 : https://github.com/purangi/BTB_Refactor
2022년 진행했던 이후는 이전보다(Better Than Before, 약칭 BTB)의 스크립트를 일부 리팩토링 하던 도중 차라리 리마스터링이 더 낫겠다는 생각이 들었고, 새로운 프로젝트를 만들어 리마스터링을 시작했다. (24.05.31)
자소서 작성 및 지원과 병행하다보니 작업 속도가 빠르진 않지만 천천히 변경점에 대해서 작성해두려고 한다.
메인 맵의 구조물들은 UI에 속하지 않는 게임 그래픽 요소이므로 UI를 사용하는 것은 부적합하다 판단하여 변경
기존에는 UI Button에 PointerEvent 구현
HouseClick.cs
public void OnPointerEnter(PointerEventData eventData)
{
ChangeImage();
}
public void OnPointerExit(PointerEventData eventData)
{
BasicImage();
}
리마스터링 버전에는 2D Sprite에 Collider를 추가하여 PointerEvent 구현함
부모 클래스인 SpriteInteraction
를 상속받아 ClickMethod를 재정의하여 메인 맵 요소들에 대한 함수를 구현했다.
SpriteInteraction.cs
public class SpriteInteraction : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
ClickMethod();
}
public void OnPointerEnter(PointerEventData eventData)
{
EnterMethod();
}
public void OnPointerExit(PointerEventData eventData)
{
ExitMethod() ;
}
protected virtual void ClickMethod()
{
}
protected virtual void EnterMethod()
{
}
protected virtual void ExitMethod()
{
}
}
MainMapSprites.cs
public class MainMapSprites : SpriteInteraction
{
[SerializeField] SpriteRenderer spriteRenderer;
Sprite basicSprite;
[SerializeField] Sprite lineSprite;
[SerializeField] Sprite exitSprite;
[SerializeField] int spriteIndex;
private void Start()
{
basicSprite = spriteRenderer.sprite;
}
protected override void ClickMethod()
{
Vector3 targetPosition = new Vector3(transform.position.x, transform.position.y, -1);
float targetSize = 2f;
CameraController.Instance.ZoomCamera(targetPosition, targetSize, spriteIndex);
}
protected override void EnterMethod()
{
spriteRenderer.sprite = lineSprite;
}
protected override void ExitMethod()
{
spriteRenderer.sprite = basicSprite;
}
}
만약 Sprite 요소에 다른 클릭 이벤트를 실행하는 스크립트를 구현할 것이라면 위와 같이 SpriteInteraction
클래스를 상속받아 사용하면 된다.
BetterThanBefore
기존에는 요소 클릭 시 카메라 이동 없이 즉시 실행
BTB_Refactor
리마스터링에선 Virtual Camera 추가하여 카메라 확대 및 이동 효과 추가
CameraController.cs
public class CameraController : Singleton<CameraController>
{
[SerializeField] CinemachineVirtualCamera zoomCamera;
[SerializeField] float zoomSpeed;
private Vector3 originalPosition;
private Vector3 targetPosition;
private float originalSize;
private float targetSize;
private Coroutine zoomCoroutine;
private Vector2 minBounds;
private Vector2 maxBounds;
private bool isZoomed = false;
public bool IsZoomed { get { return isZoomed; } }
private int itemIndex = -1;
void Start()
{
if (zoomCamera == null)
{
Debug.LogError("Virtual Camera is not assigned");
}
//SET original camera transform
originalPosition = transform.position;
originalSize = zoomCamera.m_Lens.OrthographicSize;
}
public void ZoomCamera(Vector3 _targetPosition, float _targetSize, int _index)
{
isZoomed = true;
if (_index == itemIndex)
{
ResetZoom();
return;
}
targetPosition = ClampPosition(_targetPosition);
targetSize = _targetSize;
itemIndex = _index;
zoomCoroutine = StartCoroutine(Zoom());
}
public void ResetZoom()
{
isZoomed = false;
targetPosition = originalPosition;
targetSize = originalSize;
itemIndex = -1;
if (zoomCoroutine != null)
{
StopCoroutine(zoomCoroutine);
}
zoomCoroutine = StartCoroutine(Zoom());
}
private IEnumerator Zoom()
{
Transform cameraTransform = zoomCamera.transform;
//position move until target
while (Vector3.Distance(cameraTransform.position, targetPosition) > 0.1f || Mathf.Abs(zoomCamera.m_Lens.OrthographicSize - targetSize) > 0.1f)
{
cameraTransform.position = Vector3.Lerp(cameraTransform.position, targetPosition, zoomSpeed * Time.deltaTime);
zoomCamera.m_Lens.OrthographicSize = Mathf.Lerp(zoomCamera.m_Lens.OrthographicSize, targetSize, zoomSpeed * Time.deltaTime);
yield return null;
}
cameraTransform.position = targetPosition;
zoomCamera.m_Lens.OrthographicSize = targetSize;
}
private Vector3 ClampPosition(Vector3 position) //Limit the Position
{
SetClampBounds();
float clampedX = Mathf.Clamp(position.x, minBounds.x, maxBounds.x);
float clampedY = Mathf.Clamp(position.y, minBounds.y, maxBounds.y);
return new Vector3(clampedX, clampedY, position.z);
}
private void SetClampBounds() // SET by SceneIndex
{
Scene currentScene = SceneManager.GetActiveScene();
switch (currentScene.buildIndex)
{
case 0: //MainScene
minBounds = new Vector2(-5.4f, -3f);
maxBounds = new Vector2(5.4f, 3f);
break;
}
}
}
카메라 컨트롤러 스크립트를 추가하여 카메라 확대 및 초기화, 이동 최대&최소 범위 제한 등의 기능을 구현하였습니다.
추가할 요소 - 카메라 확대 시 입장하기 버튼 활성화하여 각 인재 방 방문 기능 필요