잔잔이네
article thumbnail

오브젝트 캐릭터의 애니메이션 부여 및 블랜딩, 카메라 조정(따라오는 카메라), 총 발사 로직(총알 생성 및 발사까지)에 대해 알아보겠습니다.

 

 


 

1. 이동 (Move)

 

Player 이동 스크립트

플레이어가 전후좌우를 움직일 수 있는 스크립트

대각선으로 이동할 때 속도가 빨라지는데 이를 길이가 1인 벡터로 변환한 방향 성분만 사용한다.

Vector3.normalized를 하여 정규화 벡터값을 사용할 수 있다.


2. 회전 (Rotate)

Player 회전 스크립트

플레이어의 회전은 마우스의 좌우 이동값을 받아와서 구현한다.

왼쪽으로 움직이면 음수 값, 오른쪽으로 움직이면 양수 값을 반환한다.

florat r 변수에 이 값을 저장한다.

회전 로직 또한 구동하는 디바이스의 프레임 레이트에 관계없이 회전할 수 있게 Time.deltaTime을 곱한다.
Rotate(회전좌표축 * 회전속도 * Time.deltaTime * 변위입력 값)


3. 가상 카메라, 애니메이션,  Follow Camera

씬 뷰에서 가상 카메라의 이동

씬 뷰를 렌더링하는 가상 카메라가 주인공 캐릭터를 따라가는 기능인데

하이러키 뷰에서 Player를 선택하고 Shift + f를 누르면 가상 카메라가 플레이어가 화면 가운데에 위치한다.

이후 밑에 있는 Game뷰에 클릭한후 실행하면 씬 뷰의 가상 카메라가 플레이어를 따라 이동한다.

 

 

애니메이션

 

애니메이션 패키지를 임포트한후 플레이어모델의 정보중 Rig 탭을 선택한후 Animation Type을 Legacy로 바꿔준다.

 

애니메이션 실행

Animation 컴포넌트에 접근하기 위해 저장할 변수를 선언하고 Start 함수에서  GetComponent 함수로 해당 컴포넌트를 추출해 저장한다. 애니메이션의 실행은 Animation.Play() 함수를 사용해 재생한다.

 

애니메이션 블렌딩

이제 현재 수행 중인 애니메이션을 다른 애니메이션으로 부드럽게 연결해 보자.

애니메이션의 부드러운 변화를 이어지게 하기위해 CrossFade 함수를 사용한다.

void Update()에서 PlayerAnim(h, v); 추가

애니메이션 클립을 실행하는 CrossFade 함수에서 첫 번째 인자는 변경할 애니메이션 이고

두번째 인자는 다른 애니메이션 클립으로 페이드아웃 되는 시간을 의미한다.

이때 단순히 정해진 시간 동안 애니메이션이 변경되는 것이 아니라 애니메이션 키프레임을 보간해 부드럽게 보정시킨다.

 

이후 무기 장착, 그림자 부여는 생략하겠다.

 

Follow Camera

using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography.X509Certificates;
using UnityEngine;

public class FollowCam : MonoBehaviour
{
    // 따라가야 할 대상을 연결할 변수
    public Transform targetTr;

    // Main Camera 자신의 Transform 컴포넌트
    private Transform camTr;

    // 따라갈 대상으로부터 떨어질 거리
    [Range(2.0f, 20.0f)]
    public float distance = 10.0f;

    // Y축으로 이동할 높이
    [Range(0.0f, 10.0f)]
    public float height = 2.0f;

    // Start is called before the first frame update
    void Start()
    {
        // Maint Camera 자신의 Transform 컴포넌트를 추출
        camTr = GetComponent<Transform>();

    }

    // Update is called once per frame
    void LateUpdate()
    {
        // 추적해야할 대상의 뒤쪽으로 distance만큼 이동
        // 높이를 height만큼 이동
        camTr.position = targetTr.position
            +(-targetTr.forward * distance)
            + (Vector3.up * height);

        // Camera를 피벗 좌표를 향해 회전
        camTr.LookAt(targetTr.position);
    }
}

 

[Range(min, max)] 어트리뷰트를 사용하면 선언한 변수의 입력 범위를 (min, max)로 제한할 수 있고 인스펙터 뷰에 슬라이드바를 표시한다.

 

targetTr 변수는 Main Camera가 따라가야 할 대상을 저장할 변수이다.

 

LateUpdate는 모든 Update 함수가 실행되고 난 후 호출되는 함수이다. 

선행된 결과값을 갖고 후처리 작업을 해야 할때 사용하면 떨림 현상을 방지할 수 있다.

 

Transform.LookAt() 함수는 인자로 Vector3 좌표 또는 Transform 컴포넌트를 전달하면 해당 좌표로 회전시키는 기능을 한다. 카메라의 위치를 이동시킨 후 따라갈 대상을 향해 카메라의 각도를 회전시키는 역할을 한다.

 

Slerp 함수를 이용해 점진적으로 이동시키는 카메라를 볼 수 있다.

 

Target Offset 

 

LookAt 좌표를 조정해서 전방 시야를 확보할 수도 있다.

 

LateUpdate()


4.   총 발사 로직

총 발사 로직

처음 총알을 추가하면 총알이 서 있는 상태로 되어있는데 Rotation의 X축을 90도로 바꾸어 회전시킨다.

 

Rigidbody는 하이러키뷰의 Bullet을 선택한 후 메뉴의 Component - Physics - Rigidbody (검색해도 바로나온다) 컴포넌트를 추가한다.

총알이 바닥으로 떨어진다면 RigidBody의 Use Gravity 속성을 체크 해제한다. ( 중력의 영향을 받지 않고 직진으로 날아갈 수 있게 하기위함)

 

 

총알 스크립트

접근할 RigidBody 컴포넌트를 저장할 변수와 총알의 파괴력과 발사 힘을 저장할 변수를 선언하고

Start 함수가 실행되면 RigidBody 컴포넌트에 힘을 가하는 AddForce 함수를 사용하여 시작과 동시에 총알의 전진방향(Z축)으로 총알이 날아간다.

 

 

 

Tag 활용

하이러키 뷰 BULLET -> 인스펙터 Tag -> Add Tag -> [+] 눌러 BULLET 입력후 [Save]를 하면 새로운 태그가 추가된다.

 

이제 총알이 벽에 충돌했을 때 충돌 이벤트 함수가 호출되는지 확인해야 한다.

 

 

RemoveBullet 스크립트

이 스크립트는 프로젝트 뷰의 Wall 프리팹에 드래그앤 드랍으로 추가한다.

OnCollisionEnter 콜백 함수는 Collision 타입의 인자를 넘겨주며

Collision은 클래스이고 충돌한 게임오브젝트의 정보, 충돌 위치 및 충돌 속도등 다양한 정보가 담겨져 있다.

인자를 생략하여 정보가 필요없을때는 생략해도된다.

 

 

왼클릭으로 총알 발사 해보기 - 스크립트

FireCtrl 스크립트

Instantiate 함수는 게임오브젝트나 프리팹의 복사본을 만드는 함수이며 인자는 (생성할 객체, 생성 위치, 각도)이다.

 

FireCtrl 스크립트를 Player에 추가하면 인스펙터 뷰에 Bullet과 FirePos 변수가 노출된다.

Bullet 프리팹과 FirePos 게임오브젝트를 연결한다.

 

이후 실행하여 왼클릭을 하면 ( 게임 뷰에 왼클릭 해야한다)

총알이 발사되면서 하이러키 뷰에 Bullet(Clone)이 생성되어 Bullet 프리팹의 복사본들을 확인할 수 있다.

( Instantiate 함수를 통해 동적으로 생성된 객체는 "프리팹 이름(Clone)"의 형식으로 이름이 붙는다 )

 


이후에 총알 발사 궤적 효과, 파티클 활용, 폭발 효과, 오디오 효과, 총구 화염, 코루틴 함수에 대해 작성하겠습니다.

profile

잔잔이네

@잔잔잔잔

🌈

검색 태그