using UnityEngine;
public class MovingPlatform : MonoBehaviour
{
public enum MoveType { Horizontal, Vertical }
public MoveType moveType;
public float theta;
public float power = 0.1f;
public float speed = 1f;
private Vector3 initPos;
void Start()
{
initPos = transform.position;
}
void Update()
{
theta += Time.deltaTime * speed;
transform.position = new Vector3(initPos.x + power * Mathf.Sin(theta), initPos.y, initPos.z);
}
}
플랫폼이 움직일 수 있도록 삼각함수를 구현해 주었다.
그런데 이렇게만 구현하면 플레이어가 플랫폼에 올라탔을 때 방향키로 같이 움직여주어야 플레이어가 같이 이동되는 현상이 있다.
void Update()
{
theta += Time.deltaTime * speed;
if (moveType == MoveType.Horizontal)
transform.position = new Vector3(initPos.x + power * Mathf.Sin(theta), initPos.y, initPos.z);
else if (moveType == MoveType.Vertical)
transform.position = new Vector3(initPos.x, initPos.y + power * Mathf.Sin(theta), initPos.z);
}
// 움직이는 플랫폼 위에 플레이어가 있으면 같이 움직이도록
void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Player"))
{
other.transform.SetParent(transform);
}
}
void OnCollisionExit2D(Collision2D other)
{
if (other.gameObject.CompareTag("Player"))
{
other.transform.SetParent(null);
}
}
이 부분을 보완해 주기 위해서 플레이어가 플랫폼에 올라탔을 때에만 플레이어의 오브젝트가 플랫폼의 자식 오브젝트로 할당되게끔 바꿔주었다.
이렇게 하면 플레이어가 플랫폼 위에 있을 때, 부모 오브젝트(플랫폼)의 움직임을 따라가게 된다.
또한 플랫폼이 좌우 또는 상하로 다르게 움직일 수 있도록 enum을 활용해 타입을 구분해 주었고, 실제로 각 플랫폼마다 Horizontal, Vertical 값을 따로 설정해 주었다.
5. Light
맵의 일부 부분만 밝게 해 주려는 처리를 해주려고 한다.
Light값을 조절하기 위해서 본문 가장 처음에 다루었던 Render 설정을 꼭 해주어야 하니 참고 바란다.
우선 라이트를 적용하기 위해서 글로벌 라이트와 일부분만 밝게 처리할 Freeform 라이트 2개를 생성해 준다.
Global Light는 맵 전체의 밝기를 조절하려고 사용하고 있다.
Freeform Light만 사용할 경우 Global Light가 없으면 씬 전체가 어둡게 보이니 항상 Global Light와 함께 사용해야 자연스럽다.
그리고 Global Light에서 일부분만 밝게 보이는 것을 조금 더 강조하기 위해서 Intensity 값을 조금 내려주었다.
만약 맵의 밝기가 낮아지지 않는다면 타일맵의 머테리얼이 Lit 이 맞는지 확인해보아야 한다.
오늘부터 강사님&멘토님이랑 커피챗이 시작되었다.
대화 내내 무슨 내용으로 이야기하실지 궁금하다.. 나는 아직 무슨 게임을 개발하고 싶은지 잘 모르겠어서 할만한 이야기가 있을지도 잘 모르겠고ㅜㅜ.. 뭔가 무섭다..!!