https://stickode.tistory.com/309?category=937544
위 링크(마우스 클릭으로 유닛 이동시키기)에 이어서 이번에는 유닛 이동에 맞춰 카메라를 이동시켜보도록 하겠습니다.
실행 환경
개발 툴: Unity 2019.4.21f1
IDE : vscode
먼저 카메라를 대각선 위에서 바라보는 위치로 이동시켜보도록 하겠습니다.
카메라를 클릭하신 다음 위, 아래 그리고 카메라의 회전방향을 조절해서 방향을 맞춰줍니다.
저의 경우에는 카메라의 position 값이 x,y,z 순으로 0,10,-10 이 좋았고 회전은 x가 45일때 좋아 보였습니다. (원하시는 대로 맞추시면 됩니다.)
다음으로 카메라가 유닛을 따라다닐 수 있도록 스크립트를 작성해보도록 하겠습니다.
저번에 작성했던 MyUnit 스크립트를 실행해주세요.
그리고 코드를 아래와 같이 변경해주세요.
저번 스크립트와 달라진 부분은 mainCamera 아래 부분에 카메라가 유닛과 얼마나 떨어져 이동할지를 결정할 cameraOffset 변수가 추가됐다는 점과 Update 메소드에 mainCamera 의 위치를 이동시켜주는 부분이 추가되었습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyUnit : MonoBehaviour
{
public float speed; // 캐릭터 움직임 스피드
public CharacterController characterController; // 캐릭터 컨트롤러
public Vector3 movePoint; // 이동 위치 저장
public Camera mainCamera; // 메인 카메라
public Vector3 cameraOffset; // 카메라 상쇄(보정?)값
void Start()
{
speed = 4.0f;
mainCamera = Camera.main;
characterController = GetComponent<CharacterController>();
}
void Update()
{
// 좌클릭 이벤트가 들어왔다면
if (Input.GetMouseButtonUp(0))
{
// 카메라에서 레이저를 쏜다.
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
// Scence 에서 카메라에서 나오는 레이저 눈으로 확인하기
Debug.DrawRay(ray.origin, ray.direction * 10f, Color.red, 1f);
// 레이저가 뭔가에 맞았다면
if (Physics.Raycast(ray, out RaycastHit raycastHit))
{
// 맞은 위치를 목적지로 저장
movePoint = raycastHit.point;
Debug.Log("movePoint : " + movePoint.ToString());
Debug.Log("맞은 객체 : " + raycastHit.transform.name);
}
}
// 목적지까지 거리가 0.1f 보다 멀다면
if (Vector3.Distance(transform.position, movePoint) > 0.1f)
{
// 이동
Move();
}
// 매 업데이트 메소드가 실행될 때마다 카메라의 위치를 오브젝트의 위치 + 카메라 상쇄(보정)의 위치로 바꾼다.
mainCamera.transform.position = transform.position + cameraOffset;
}
void Move()
{
// thisUpdatePoint 는 이번 업데이트(프레임) 에서 이동할 포인트를 담는 변수다.
// 이동할 방향(이동할 곳-현재 위치) 곱하기 속도를 해서 이동할 위치값을 계산한다.
Vector3 thisUpdatePoint = (movePoint - transform.position).normalized * speed;
// characterController 는 캐릭터 이동에 사용하는 컴포넌트다.
// simpleMove 는 자동으로 중력을 계산해서 이동시켜주는 메소드다.
// 값으로 이동할 포인트를 전달해주면 된다.
characterController.SimpleMove(thisUpdatePoint);
}
}
스틱코드를 사용하신다면 아래 링크로 이동해서 즐겨찾기 하신 후 MyUnity.cs 파일을 비우시고 'followCamera' 자동완성을 실행해주세요.
https://stickode.com/detail.html?no=2676
MyUnit.cs 파일을 저장(중요!)하신 후에 hierachy 창에서 capsule 오브젝트를 클릭하신 후 inspector 창에서 My Unit 컴포넌트를 확인하시면 가장 아래쪽에 방금 추가한 필드인 Camera Offset 이 보이실겁니다.
이 부분에 아까 설정하신 카메라의 position 값을 넣어주세요.
이제 게임을 실행하시면 카메라가 유닛을 따라오는 것을 볼 수 있습니다.
화면 이동이 되는걸 확인했으니 맵을 키워보도록 하겠습니다.
Plane 을 선택하시고 transform 의 scale 을 x,y,z 모두 10으로 변경해주세요
실행해보시면 전부다 흰색이여서 이동하는 모습이 잘 안보이실 겁니다.
잘 보일 수 있도록 바닥에 질감을 넣어보도록 하겠습니다.
좌측 위 Scene 옆에 Asset Store 탭을 클릭해줍니다.
에셋 스토어에서 Assets-Textures & Materials 를 선택해주세요.
혹시 Asstes 메뉴가 안보이시면 창의 가로 크키가 너무 좁아서 그럴 수 있으니 가로 길이를 늘려보세요.
그리고 스크롤을 조금 내리시면 우측에 Free Assets 부분이 보이실 겁니다. 무료 에셋만 보는 설정입니다. 체크해주세요.
가장 앞(왼쪽위) 있는 에셋을 다운받아 보겠습니다.
아래 이미지의 import 부분이 Download 라고 적혀있으실텐데 다운로드 먼저해주시고 다음으로 import 를 눌러주세요.
import 가 끝나면 창이 생기는데 Samples 의 체크를 푸신 다음 스크롤을 가장 아래쪽으로 이동하시고, rock_albedo.tif 만 체크를 해주세요.
그리고 오른쪽 아래 Import 를 클릭해주세요.
에셋의 import 가 완전히 끝나면 Project 창에 Samples 파일이 생성된 것을 볼 수 있습니다.
필요없는 폴더들을 삭제하기 위해서 Textures 폴더를 만들고 필요한 텍스처 파일을 이동시키도록 하겠습니다.
이제 텍스처 파일을 Hierarchy 의 Plane 오브젝트에 드래그&드롭을 하시면 바닥의 텍스처가 변경된 것을 볼 수 있습니다.
마지막으로 실행화면 입니다.
'C#' 카테고리의 다른 글
[C#][Unity] 캐릭터 공격 모션 구현하기 (0) | 2022.01.27 |
---|---|
[C#][Unity] 캐릭터 회전 구현하기 (0) | 2022.01.04 |
[C#][Unity] 마우스 클릭으로 유닛 이동시키기 (0) | 2021.12.12 |
[C#][Unity] Http 통신 하기!! (0) | 2021.10.04 |
[C#][Unity]시점을 이동하는 카메라! (0) | 2021.09.27 |