[Unity Tutorial Slime World 06] Applying Monster Animations and Checking Collision


1. 애니메이션 타입을 레거시에서 메카님으로 변경 (Converting Legacy to Mecanim)

cha_data -> monster-> cha_slime -> Motions 

-> Mot_Slime@Attack, Mot_Slime@Damage, Mot_Slime@Dead, Mot_Slime@Wait, Mot_Slime@Walk 

-> Inspector -> Rig -> Animation Type -> Legacy 에서 Generic 으로 변경 후 Apply


2. 몬스터 슬라임에 Animator 추가

Slime -> Add Component -> Animator 생성 

Slime -> Animator -> Controller -> Slime Controller 추가


3. Animator 수정

 State

Parameter 

Value 

 Wait -> Walk

isWalking

true 

Walk -> Wait 

isWalking

false 

Any State -> Attack 

isAttacking 

true 

Any State -> Damage 

isDamaging 

true 

Any State -> Dead 

isDead 

true 


4. 플레이어 무기에 태그 추가

Player -> Group Locator -> Sword02 -> Tag -> Sword 추가


5. 플레이어 무기와 몬스터 슬라임에 충돌 박스 콜라이더 추가

Player -> Group Locator -> Sword02 -> Add Component -> Box Collider 생성 -> Is Trigger 체크

Slime -> Add Component -> Box Collider 생성 -> Is Trigger 체크


6. SlimeController 스크립트 수정


[Unity Tutorial Slime World 04] Monster Moving


1. 몬스터 슬라임에 네비게이션 추가

Slime -> Add Component -> Nav Mesh Agent


2. 네비게이션 맵 영역 설정

Window -> Navigation

Stg_Floor -> Navigation -> Bake -> Clear -> Bake


3. 플레이어 태그 생성

Player -> Tag -> Player


4. 몬스터 슬라임에 SlimeController 스크립트 생성

Slime -> Add Component -> New Script -> SlimeController 스크립트 생성


5. SlimeController 스크립트 수정


6. 몬스터 슬라임 속도 지정

Slime -> Slime Controller (Script) -> Run Speed : 1


[Unity Tutorial Slime World 03] Player Attacking and Apply Animations


1. 애니메이션 타입을 레거시에서 메카님으로 변경 (Converting Legacy to Mecanim)

cha_data -> character -> cha_knight -> Motions

-> Mot_Knight@Attack, Mot_Knight@Damage, Mot_Knight@Dead, Mot_Knight@Wait, Mot_Knight@Walk

-> Inspector -> Rig -> Animation Type -> Legacy 에서 Generic 으로 변경 후 Apply


2. 플레이어에 Animator 추가

Player -> Add Component -> Animator 생성

Player -> Animator -> Controller -> Knight Controller 추가


3. Animator 스테이트 생성

Animator -> Create State -> Empty -> Wait, Walk, Attack, Damage, Dead 5개의 스테이트 생성


4. Animator 트랜지션 생성

Make Transition 로 5개의 스테이트 연결

5. Animator 파라미터 변수 생성

Animator -> Parameters -> isRunning, isAttacking, isDamaging, isDead 생성



6. Animator 조건 추가

Transition (화살표) -> Conditions -> Parameter와 Value 추가

 State

Parameter 

Value 

 Wait -> Walk

isRunning 

true 

Walk -> Wait 

isRunning 

false 

Any State -> Attack 

isAttacking 

true 

Any State -> Damage 

isDamaging 

true 

Any State -> Dead 

isDead 

true 



7. PlayerController 스크립트 수정


- Reference

[레거시 애니메이션 시스템] https://docs.unity3d.com/kr/current/Manual/Animations.html

[애니메이션 및 메카님 용어] https://docs.unity3d.com/kr/current/Manual/AnimationGlossary.html



[Unity Tutorial Slime World 02] Player Moving And Rotating


1. Player Controller 스크립트 생성

Player -> Add Component -> New Script -> PlayerController 생성


2. Player Controller 스크립트 수정


3. 플레이어 이동 속도와 회전 속도 지정

Player -> Player Controller (Script) -> Run Speed : 2, Rotation Speed : 100 으로 변경

[Unity Tutorial SlimeWorld  01] Creating a new project and Setting up the Game


1. 에셋스토어에서 리소스 다운로드 하기

에셋스토어에서 Animated Knight and Slime Monster 다운로드 하기

https://www.assetstore.unity3d.com/kr/#!/content/24471


2. 새 씬 생성하기 (Ctrl + N)


3. 스테이지 바닥 생성하기

cha_data -> monster -> char_slime -> Models -> Stg_Floor 를 Scene에 넣기

Stg_Floor -> Transform Reset -> Scale (10, 10, 10) 으로 변경


4. 플레이어(Knight)  생성하기

cha_data -> character -> cha_knight -> models -> Cha_Knight 를 Scene에 넣기

Cha_Knight의 이름을 Player로 변경

Player -> Transform Reset


5. 적(Slime) 생성하기

cha_data -> monster -> char_slime -> Models -> Cha_Slime 을 Scene에 넣기

Cha_Slime의 이름을 Enemy로 변경

Enemy -> Transform Reset -> Position (3, 0, 0) 으로 변경


6. 카메라 세팅하기

Main Camera

Position (0, 1.8, 3)

Rotation (30, 180, 0)



[Unity Tutorial Roll-a-ball 08] Building the Game

1. 씬 저장하기

File -> Save Scenes (단축키 : Ctrl + S)

2. 게임 빌드하기

File -> Build Settings -> PC 선택 -> Add Open Scenes

3. 윈도우용 게임 실행 파일 생성

Builds 폴더 생성 -> Roll a Ball(Win) 이름으로 저장

4. 게임 실행

Roll a Ball(Win) 게임 파일 실행하기

Screen 에서 원하는 해상도 선택 -> Play!

게임 종료 : Alt + F4

 

-Reference

[Building the Game] https://unity3d.com/kr/learn/tutorials/projects/roll-ball-tutorial/building-game?playlist=17141

[Unity Tutorial Roll-a-ball 07] Displaying the Score and Text

1. 점수 카운트 변수 생성 및 계산

PlayerController 스크립트 수정

}

    // 에디터 안 Inspector에서 편집 가능한 속도 조정 변수 생성
    public float speed;
    // Rigidbody 형태의 변수 생성
    private Rigidbody rb;
    // 점수 카운트 변수
    private int count;

    // 스크립트가 활성화된 첫 프레임에 호출
    void Start()
    {
        // 현재 오브젝트의 Rigidbody를 참조
        rb = GetComponent<Rigidbody>();
        // 점수 초기화
        count = 0;
    }

    // 프레임을 렌더링 하기 전에 호출
    void Update()
    {

    }

    // 물리효과 계산을 수행하기 전에 호출
    void FixedUpdate()
    {
        // 키보드의 키로 컨트롤하는 수평 축의 입력 (left, right)
        float moveHorizontal = Input.GetAxis("Horizontal");
        // 키보드의 키로 컨트롤하는 수직 축의 입력 (up, down)
        float moveVertical = Input.GetAxis("Vertical");

        // 플레이어의 이동량을 선언 (x축, y축, z축)
        Vector3 movemnet = new Vector3(moveHorizontal, 0, moveVertical);
        // 플레이어의 Rigidbody에서 movement 값만큼 힘을 가해서 이동시킴
        rb.AddForce(movemnet * speed);
    }

    // 트리거 콜라이더를 처음 접촉할 때 호출
    void OnTriggerEnter(Collider other)
    {
        // 오브젝트의 태그 값 비교
        if ( other.gameObject.CompareTag("PickUp"))
        {
            // 오브젝트 비활성화
            other.gameObject.SetActive(false);
            // 점수 카운트 업
            count = count + 1;
        }       
    }

2. UI 점수 텍스트 생성

Hierarchy -> Create -> UI -> Text -> CountText로 이름 변경

CountText -> Color -> 흰색으로 색상 변경

CountText -> Rect Transform -> 설정 (톱니 바퀴) -> Reset

CountText -> Rect Transform -> custom 박스를 Shift + Alt + 마우스 우클릭 -> left, top 선택 

CountText -> Rect Transform -> Pos X : 10, Pos Y : -10 으로 변경

3. UI 승리 텍스트 생성

Hierarchy -> Create -> UI -> Text -> WinText로 이름 변경

WinText-> Color -> 흰색으로 색상 변경

WinText-> Rect Transform -> 설정 (톱니 바퀴) -> Reset ->Pos Y : 75 로 변경

WinText-> Character -> Font Size : 24 로 변경

WinText-> Paragraph -> Alignment 가운데 정렬로 변경

4. UI 점수, 승리 텍스트 초기화 및 표시

PlayerController 스크립트 수정

 // UI 엔진
using UnityEngine.UI;

public class PlayerController : MonoBehaviour {

    // 에디터 안 Inspector에서 편집 가능한 속도 조정 변수 생성
    public float speed;
    // 에디터의 UI 점수 텍스트
    public Text CountText;
    // 에디터의 UI 승리 텍스트
    public Text WinText;

    // Rigidbody 형태의 변수 생성
    private Rigidbody rb;
    // 점수 카운트 변수
    private int count;

    // 스크립트가 활성화된 첫 프레임에 호출
    void Start()
    {
        // 현재 오브젝트의 Rigidbody를 참조
        rb = GetComponent<Rigidbody>();
        // 점수 초기화
        count = 0;
        // 점수 텍스트 표시
        SetCountText();
        // 승리 텍스트 초기화
        WinText.text = "";
    }

    // 프레임을 렌더링 하기 전에 호출
    void Update()
    {

    }

    // 물리효과 계산을 수행하기 전에 호출
    void FixedUpdate()
    {
        // 키보드의 키로 컨트롤하는 수평 축의 입력 (left, right)
        float moveHorizontal = Input.GetAxis("Horizontal");
        // 키보드의 키로 컨트롤하는 수직 축의 입력 (up, down)
        float moveVertical = Input.GetAxis("Vertical");

        // 플레이어의 이동량을 선언 (x축, y축, z축)
        Vector3 movemnet = new Vector3(moveHorizontal, 0, moveVertical);
        // 플레이어의 Rigidbody에서 movement 값만큼 힘을 가해서 이동시킴
        rb.AddForce(movemnet * speed);
    }

    // 트리거 콜라이더를 처음 접촉할 때 호출
    void OnTriggerEnter(Collider other)
    {
        // 오브젝트의 태그 값 비교
        if ( other.gameObject.CompareTag("PickUp"))
        {
            // 오브젝트 비활성화
            other.gameObject.SetActive(false);
            // 점수 카운트 업
            count = count + 1;
            // 점수 텍스트 표시
            SetCountText();
        }
    }

    // 점수 텍스트 표시
    void SetCountText()
    {
        CountText.text = "Count: " + count.ToString();
        // 12개 오브젝트 전부 수집시에 승리 텍스트 표시
        if (count >= 12)
        {
            WinText.text = "You Win!";
        }
    }
}

Player -> Inspector -> Player Controller(Script) -> Count Text, Win Text에 UI Text 설정

 

-Reference

[Displaying the Score and Text] https://unity3d.com/kr/learn/tutorials/projects/roll-ball-tutorial/displaying-score-and-text?playlist=17141

 

[Unity Tutorial Roll-a-ball 06] Collecting the Pick Up Objects

1. 플레이어 컨트롤러 스크립트에 충돌 트리거 추가

 public class PlayerController : MonoBehaviour {

    // 에디터 안 Inspector에서 편집 가능한 속도 조정 변수 생성
    public float speed;
    // Rigidbody 형태의 변수 생성
    private Rigidbody rb;

    // 스크립트가 활성화된 첫 프레임에 호출
    void Start()
    {
        // 현재 오브젝트의 Rigidbody를 참조
        rb = GetComponent<Rigidbody>();
    }

    // 프레임을 렌더링 하기 전에 호출
    void Update()
    {

    }

    // 물리효과 계산을 수행하기 전에 호출
    void FixedUpdate()
    {
        // 키보드의 키로 컨트롤하는 수평 축의 입력 (left, right)
        float moveHorizontal = Input.GetAxis("Horizontal");
        // 키보드의 키로 컨트롤하는 수직 축의 입력 (up, down)
        float moveVertical = Input.GetAxis("Vertical");

        // 플레이어의 이동량을 선언 (x축, y축, z축)
        Vector3 movemnet = new Vector3(moveHorizontal, 0, moveVertical);
        // 플레이어의 Rigidbody에서 movement 값만큼 힘을 가해서 이동시킴
        rb.AddForce(movemnet * speed);
    }

    // 트리거 콜라이더를 처음 접촉할 때 호출
    void OnTriggerEnter(Collider other)
    {
        // 오브젝트의 태그 값 비교
        if ( other.gameObject.CompareTag("PickUp"))
        {
            // 오브젝트 비활성화
            other.gameObject.SetActive(false);
        }       
    }
}

2. PickUp 오브젝트에 PickUp 태그 달기

Prefabs PickUp -> Inspector -> Tag -> AddTag

Tags -> PickUp 태그 추가

PickUp -> Tag -> PickUp 선택

3. PickUp 오브젝트에 충돌 트리거 활성화

Prefabs PickUp -> Box Collider -> Is Trigger 체크 박스 활성화

4. PickUp 오브젝트에 물리 엔진 추가 (PickUp 오브젝트 애니메이션 최적화)

Prefabs PickUp -> Add Component -> Physics -> Rigidbody -> Is Kinematic 체크 박스 활성화

 

 

-Reference

[Collecting the Pick Up Objects] https://unity3d.com/kr/learn/tutorials/projects/roll-ball-tutorial/collecting-pick-objects?playlist=17141

[유니티 튜토리얼 예제 Roll-a-ball 05] Creating Collectable Objects

1. 수집 오브젝트 큐브 생성

Hierarchy -> Create -> 3D Object -> Cube -> PickUp으로 이름 변경

PickUp -> Inspector -> Transform -> Reset

2. 플레이어 오브젝트 Active 해제

 Player -> Inspector -> 체크박스 해제

3. PickUp 오브젝트의 모양과 크기 변경

PickUp -> Transofrom -> Position (0, 0.5, 0), Rotation (45, 45, 45), Scale (0.5, 0.5, 0.5) 로 수정

4. PickUp 오브젝트에 실시간 움직임 추가

PickUp -> Add Component -> New Script -> Rotator 스크립트 생성

PickUp -> Rotator 스크립트 수정 -> Scripts 폴더에 드로우 하여 넣기

public class Rotator : MonoBehaviour {
    // Update is called once per frame
    void Update ()
    {
        // transform의 Rotate 값을 시간에 비례하여 변경
     transform.Rotate (new Vector3 (15, 30, 45) * Time.deltaTime);
    }
}

5. PickUp 오브젝트를 Prefabs 로 생성

Project -> Create -> Folder 생성 -> Prefabs 으로 이름 변경

PickUp 오브젝트를 Prefabs 폴더로 드로우하여 넣기

6. PickUp 오브젝트 12개 생성

Hierarchy -> Create Empty -> PickUps 로 이름 변경 -> PickUp 오브젝트를 PickUps로 드로우해서 넣기

PickUp 선택 -> ctrl + D -> 12개 생성해서 Scene에 배치

7. 12개의 PickUp 오브젝트 색상 변경

Project->Materials 폴더 -> Create -> Materials -> PickUp으로 이름 변경 -> Inspector -> Albedo 색상 -> RGB (255, 255, 0)으로 수정

PickUp Material을 Prefabs PickUp에 드로우해서 색상 적용

 

 

 

- Reference

[Creating Collectable Objects] https://unity3d.com/kr/learn/tutorials/projects/roll-ball-tutorial/creating-collectable-objects?playlist=17141

[Unity Tutorial Roll-a-ball 04] Setting up the Play Area

1. 벽의 부모 게임 오브젝트 생성

GameObject -> Create Empty -> 오브젝트 이름 Walls 로 변경 -> Inspector -> 설정 (톱니 바퀴) -> Reset

2. 벽 큐브 생성

GameObject -> 3D Object -> Cube -> 오브젝트 이름 WestWall 로 변경 -> Inspector -> 설정 (톱니 바퀴) -> Reset -> Walls 오브젝트로 드래그 하여 넣기

3. 벽 큐브 3개 복사하기

WestWall 선택 -> Edit -> Duplicate (단축키 : ctrl + D) -> 각 오브젝트 이름 EastWall, NorthWall, SouthWall 로 변경

4. 벽 큐브 크기와 위치 변경하기

 

 WestWall

EastWall 

NorthWall 

SouthWall 

Position 

 -10, 0, 0

 10, 0, 0

 0, 0, 10

 0, 0, -10

Scale 

 0.5, 2, 20.5

 0.5, 2, 20.5

 20.5, 2, 0.5

 20.5, 2, 0.5

 

 

 

- Reference

[Setting up the Play Area] https://unity3d.com/kr/learn/tutorials/projects/roll-ball-tutorial/setting-play-area?playlist=17141

+ Recent posts