
preview Link : https://velog.io/@suhan0304/Unity-Electricity-9
gitHub Link : https://github.com/suhan0304/Electricity
기존에 CameraTarget 오브젝트를 endPoint로 옮기면서 자연스러운 클로즈업을 수행했는데, 이게 y좌표도 endPoint의 y좌표로 살짝 올라가면서 카메라가 살짝 상하로 움직인다. 그래서 y좌표는 기존 CameraTarget의 y좌표를 받아와서 그대로 사용하도록 수정해줬다.
/// <summary>
/// Move CameraTarget to EndPoint
/// </summary>
IEnumerator MoveTargetToPosition(Transform endPoint, float duration)
{
Vector3 startPosition = CameraTarget.transform.position;
Vector3 endPosition = new Vector3(endPoint.position.x, startPosition.y, endPoint.position.z);
float elapsedTime = 0f;
while ( elapsedTime < duration )
{
float t = Mathf.Clamp01(elapsedTime / duration);
float smoothT = Mathf.SmoothStep(0.0f, 1.0f, t);
CameraTarget.transform.position = Vector3.Lerp(startPosition, endPosition, smoothT);
elapsedTime += Time.deltaTime;
yield return null;
}
CameraTarget.transform.position = endPoint.position;
}
하단에 사용가능한 블럭의 종류와 블럭의 개수를 띄울 UI를 개발해보자. 여러가지 방식이 있는데 사용 가능한 블럭 아이템만 UI에 표시되는 방식, 모든 블럭을 하단 띄우고 사용가능한 갯수에 따라서 표시를 다르게 해주는 방식, 사용 가능한 블럭의 종류와 개수에 따라서 UI가 좀 유동적으로 바뀌게 해서 블럭의 종류를 추후에 추가했을때에도 바로바로 업데이트 될 수 있도록 방향을 잡아보자.

버튼을 누를 때마다 선택되는 블럭 프리팹을 바꾸게 하기 위해 버튼을 두개 만든 다음에 Y를 2배로 늘린 한 OtherBlockPrefab을 하나 만들어줬다.

using UnityEngine;
public class BuildMenu : MonoBehaviour
{
BuildManager buildManager;
private void Start()
{
buildManager = BuildManager.Instance;
}
public void SelectStandardBlock()
{
Debug.Log("Standard Block Selected");
buildManager.SetBlockToBuild(buildManager.standardBlockPrefab); // set selected block to Standard block
}
public void SelectOtherBlock()
{
Debug.Log("Other Block Selected");
buildManager.SetBlockToBuild(buildManager.otherBlockPrefab); // set selceted block to Other block;
}
}
이제 버튼별로 이벤트를 연결해주자.

노드가 선택되지 않았을땐 OnMouseEnter, OnMouseDown 이벤트를 실행하지 않도록 수정해주었다.
public void OnMouseEnter() // When the mouse passes or enters an object collider
{
if (buildManager.GetBlockToBuild() == null || !isBuildable)
return;
if (GameManager.Instance.gameState == GameState.PLAY)
{
if (EventSystem.current.IsPointerOverGameObject())
return;
StartCoroutine(transparentBlockNodeControl());
rend.material.color = hoverColor; // change color to hoverColor
}
}
public void OnMouseDown() //When the mouse click the object collider
{
if (buildManager.GetBlockToBuild() == null || !isBuildable)
return;
// Build a Block
if (GameManager.Instance.gameState == GameState.PLAY)
{
if (EventSystem.current.IsPointerOverGameObject())
return;
BuildManager.Instance.BuildBlockOnNode(this);
Vector3 targetPos = transBlockOnNode.transform.position;
transBlockOnNode.transform.position = new Vector3(targetPos.x, transBlockHeight, targetPos.z);
}
}
마우스가 UI의 버튼 위에 올라갔을때도 MouseOnEnter 이벤트가 실행되는데 이를 방지하기 위해 아래와 같은 조건문을 Node.cs에 추가해주었다.
if (EventSystem.current.IsPointerOverGameObject()) { StartCoroutine(transparentBlockNodeControl()); rend.material.color = hoverColor; // change color to hoverColor }IsPointerOverGameObject, 마우스(pointer)가 UI 내부에 있으면 True, 아니면 False를 반환한다.
두 가지 문제가 생겼다. Instantiate 하는데 OtherBlock의 Scale이 프리팹과는 다르게 복제된다는 점과 노드 내부에 반투명 블럭을 넣어서 해당 블럭을 건설하기 전에 볼 수 있도록 해놨는데 블럭의 종류가 많아지면 블럭별로 반투명한 프리팹을 또 만들어야 한다. 일단 반투명 블럭 로직을 제거하고 고쳐보자.
motion을 수정해주니깐 잘 실행됐다.
Animation Override Controller를 통해 기존의 acBlock을 사용하면 transition이나 Trigger은 동일하게 설정되고 motion만 덮어씌울 수 있다.

Other Block으로는 EndPoint에 전류가 흐르질 않아서 해당 문제를 고치고 부도체 블럭을 하나 만들어서 기본 맵 세팅을 해보자.