유니티 Animation 기능을 사용하여 카메라 이동 구현하기

728x90

 

카메라 이동 애니메이션 구현

씬 상에 가상의 위치값을 정해놓은 후 오브젝트가 해당 값으로 이동하면서 카메라가 따라가는 애니메이션을 구현했다.

Create Empty(positions)를 생성 후 자식 Create Empty(pos1 ~ pos8)까지 생성해주었다. 그리고 각각의 pos 오브젝트의 인스펙터 창에서 cube 모양을 클릭 후 가상의 초록색 점을 매핑해주었다. 이는 씬 상에서만 보이지 플레이하면 보이지 않는다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class movPath : MonoBehaviour
{
	public bool bDebug = true;
	public float Radius = 2.0f;
	public Transform[] transPos;	
	public float speed = 2.0f;
	public float mass = 5.0f;
	public bool isLooping = true;
	private float curSpeed;
	private int curPathIndex;
	private float pathLength;
	private Vector3 targetPoint;

	Vector3 velocity;
	void Start()
	{
		pathLength = Length;
		curPathIndex = 0;
		velocity = transform.forward;
	}

	void Update()
	{
		curSpeed = speed * Time.deltaTime;
		targetPoint = GetPoint(curPathIndex);
		if (Vector3.Distance(transform.position, targetPoint) < Radius)
		{
			if (curPathIndex < pathLength - 1)
			{
				curPathIndex++;
			}
			else if (isLooping)
			{
				curPathIndex = 0;
			}
			else
			{
				return;
			}
		}
		if (curPathIndex >= pathLength)
		{
			return;
		}
		if (curPathIndex >= pathLength - 1 && !isLooping)
		{
			velocity += Steer(targetPoint, true);
		}
		else
		{
			velocity += Steer(targetPoint);
		}

		transform.position += velocity;
		transform.rotation = Quaternion.LookRotation(velocity);
	}

	public Vector3 Steer(Vector3 target, bool bFinalPoint = false)
	{
		Vector3 desiredVelocity = (target - transform.position);
		float dist = desiredVelocity.magnitude;

		desiredVelocity.Normalize();

		if (bFinalPoint && dist < 10.0f)
		{
			desiredVelocity *= (curSpeed * (dist / 10.0f));
		}
		else
		{
			desiredVelocity *= curSpeed;
		}

		Vector3 steeringForce = desiredVelocity - velocity;
		Vector3 acceleration = steeringForce / mass;

		return acceleration;
	}

	public float Length
	{
		get
		{			
			return transPos.Length;
		}
	}
	public Vector3 GetPoint(int index)
	{
		return transPos[index].position;		
	}
	void OnDrawGizmos()
	{

		if (!bDebug)
		{
			return;
		}
		for (int i = 0; i < transPos.Length; i++)
		{
			if (i + 1 < transPos.Length)
			{
				Debug.DrawLine(transPos[i].position, transPos[i + 1].position, Color.red);
			}
		}
	}
}

Cube에 다음과 같은 스크립트를 연결해주었다. 그리고 원하는 위치에 배치한 pos값들을 스크립트에 매핑해주고 플레이했더니 Cube가 pos1부터 pos9 임의의 path까지 차례로 이동하는 것을 확인할 수 있었다. 씬 상의 빨간색 선은 씬뷰에서만 보이고 플레이 상에서는 보이지 않는다. 그리고 Cube에 Main Camera를 상속시키면 Cube를 비추며 카메라가 함께 이동하는 것을 볼 수 있다.

728x90