와와

절대강좌유니티 본문

개발/Unity 3D

절대강좌유니티

정으주 2022. 1. 26. 16:49

p54 ~ p117

 

1. matarial 설정

 

2. 스내핑: V키

 

3. light

 

 1) Directional Light ( default )

   : 전체화면에 균일한 빛 ( 태양 ), 가장 저렴

 

 2) Point Light

   : 전구, 360˚로 퍼짐

 

 3) Spot Light

   : 콘 모양, 가장 비쌈

 

 4) Area Light

   : 사각형 형태, 한쪽 면에서 빛을 발하는 조명, 실시간X, 주로 간접 조명으로 사용

 

4. 하늘 표현

 

 1) Skybox

   : 6sided, Cubemap, Panoramic, Procedural(텍스처X, 직접설정)

 

 2) Skydome

 

 

p118 ~ p 168 

 

1. 단축키

 콘솔: ctrl + shift + c

 실행: ctrl + p

 씬뷰 가상카메라 팔로우: ctrl + F

 

2. GetAxisRaw()

 GetAxis() : -1.0f ~ +1.0f 사이의 값 반환

 GetAxisRaw() : -1.0f, 0, +1.0f 세 가지 중 하나의 값 반환

 

3. GetComponent<>()

 GetComponent<추출할 클래스>();

 

4.Translate()

 Void Translate(  Vector3 direction,  Space.World/ Space.Self ( 기본 )  )

 

5. Time.deltaTime

Time.deltaTime = ( 현재 프레임 시작 시간 ) - ( 이전 프레임 시작 시간 )

 

transform.Translate(Vector3.forward * 10);

: 프레임마다 10유닛씩 이동

transform.Translate(Vector3.forward * Time.deltaTime * 10);

: 매 초 10유닛씩 이동

 

6. normalized

 벡터크기 정규화 ( 방향벡터에 사용 )

 

7. 애니메이션

 레거시 애니메이션: Animation 컴포넌트

 메카님 애니메이션: Animator 컴포넌트

 

 Animation.Play("애니메이션 클립명") // 애니메이션 실행

 

8. 애니메이션 블랜딩

 애니메이션 변경을 부드럽게 해줌 (CrossFade)

 

PlayerCtrl.cs

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

public class PlayerCtrl : MonoBehaviour
{

    // 컴포넌트를 캐시 처리할 변수
    private Transform tr;
    // Animation 컴포넌트를 저장할 변수
    private Animation anim;
    // 이동 속도 변수 ( public으로 선언되어 인스펙터 뷰에 노출됨 )
    public float moveSpeed = 10.0f;
    // 회전 속도 변수
    public float turnSpeed = 80.0f;


    // Start is called before the first frame update
    void Start()
    {
        // Transform 컴포넌트를 추출해 변수에 대입
        tr = GetComponent<Transform>();  // 함수명 < 형식(추출할클래스) > ( 매개변수 )
        anim = GetComponent<Animation>();

        // 애니메이션 실행
        anim.Play("Idle");
    }

    // Update is called once per frame
    void Update()
    {
        float h = Input.GetAxis("Horizontal"); //-1.0f ~ 0.0f ~ +1.0f
        float v = Input.GetAxis("Vertical"); //-1.0f ~ 0.0f ~ +1.0f
        float r = Input.GetAxis("Mouse X"); // 마우스 왼쪽: 음수 , 오른쪽: 양수 반환

        //Debug.Log("h=" + h);
        //Debug.Log("v=" + v);

        //전후좌우 이동 방향 벡터 계산
        Vector3 moveDir = (Vector3.forward * v) + (Vector3.right * h);

        //Trasnsform 컴포넌트의 위치를 변경
        // transform.position += new Vector3(0,0,1);

        //정규화 벡터를 사용한 코드
        //transform.position += Vector3.forward * 1;  // ( 전진방향 ) * ( 속력 )

        // Translate 함수를 사용한 이동 로직
        tr.Translate(moveDir.normalized * Time.deltaTime * moveSpeed ); // ( 방향 ) * deltaTime * {전진/후진} * ( 속도 ) 

        // Vector3.up 축을 기준으로 turnSpeed만큼의 속도로 회전
        tr.Rotate(Vector3.up * turnSpeed * Time.deltaTime * r); // (회전좌표축) * (회전속도) * Time.deltaTime * (변위입력값)

        // 주인공 캐릭터의 애니메이션 설정
        PlayerAnim(h, v);

    }

    void PlayerAnim(float h, float v)
    {
        // 키보드 입력값에 따라 동작할 애니메이션 수행

        if (v >= 0.1f)
        {
            anim.CrossFade("RunF", 0.25f); // 전진 애니메이션 실행
        }
        else if (v <= -0.1f)
        {
            anim.CrossFade("RunB", 0.25f); // 전진 애니메이션 실행
        }
        else if (h >= 0.1f)
        {
            anim.CrossFade("RunR", 0.25f); // 전진 애니메이션 실행
        }
        else if (h <= -0.1f)
        {
            anim.CrossFade("RunL", 0.25f); // 전진 애니메이션 실행
        }
        else
        {
            anim.CrossFade("Idle", 0.25f);
        }
    }
}

 

 

 

p169 ~ p198 

 

1. 무기 장착

 pelvis

 

2. 그림자

 실시간 그림자는 부하가 큼

 실시간 그림자off -> 새로 오브젝트 추가 -> 캐릭터 오브젝트의 차일드화 -> Shader 설정 ( Mobile/Paricle/Multiply )

 

3. LOD ( Level Of Detail )

 화면을 렌더링하는 카메라로부터 멀리 떨어질수록 낮은 폴리곤으로 변경해 렌더링 부하를 줄여주는 기법

 LOD Group 컴포넌트로 각 LOD 영역에 메시 연결

 

4. Follow Camera 로직

 

카메라 위치 = 타깃의 위치 + ( 타깃의 뒤쪽 방향 * 떨어질 거리 ) + ( Y축 방향 * 높이 )

 

FollowCam.cs

using System.Collections;
using System.Collections.Generic;
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()
    {
        //Main 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);
    }
}

 

 

p199 ~ p250