유니티/실습

주말 숙제 - 1인칭 게임 - 2

파란색까마귀 2022. 2. 13. 23:05

2016. 3. 31. 10:10

https://blog.naver.com/nagne2011/220670215418

 

 

 

어제 다운 받은 에셋들중

케릭터 컨트롤러에 도끼와 방패를 적당히 배치했다

왠지 귀엽다

 

이제 애니메이션을 '직접' 제작해보자

Windows -> animation으로 애니메이션 텝을 열어보자 

(animator랑 animation은 다르다!!)

 

좌측중간쯤에 'Axe_idle'이라고 써있는 곳을 클릭하면 새로 animation Clip을 만들 수 있다



 

우측 상단에 '녹화'버튼이 클릭된 상태에서

오브젝트를 이동, 회전, 크기변경 등 변화를 시킨다면 해당 값이 마름모 모양으로 각 프레임에 저장이된다

 

 

 

열심히 노가다를 해서 마음에 드는 애니메이션을 쭉 만들어주자

idle은 있는편이 생동감도 있고 관리하기도 편하기때문에

왠만하면 만들어주자

 

 

그다음 Animator 탭을 열어서 위 스샷과 같이 animation Clip들을 배치해주자

배치 위치는 편한대로 하면된다

 

다만 시작애니메이션(주황색)은 idle이 되도록하면된다

그리고 각 클립을 우클릭하고 Make Transition을 클릭하면 화살표가 시작되는데, 

요게 클립끼리 연결시켜주는 조건문이다

 

역시 위 스샷대로 idle->Up 해주고, Up->idle도 만들어준다

이걸 전부 다해준다

 

 

 

좌측에 보면, Parameters 텝이 있다,

Name옆에 + 버튼을 클릭하면 int조건, bool조건등등을 선택할 수 있는데,

공격모션이니 bool값을 클릭해서 위와 같은 이름으로 만들어준다

 

딱히 위와 동일한 이름으로 할 필요는 없지만, 이름이 어떻게 되있는지 꼭 기억해야된다

(물론 다시 열어서 확인하면 되지만..)

 

 

그리고 만든 화살표를 클릭해보면 인스펙터 창에 위와 같이 나온다

중요하게 볼건

'Has Exit Time' 메뉴와 아래의 Conditions다

Has Exit Time메뉴는 유니티 레퍼런스를 참고해보자

 

 

Has Exit Time 트랜지션 조건이 언제든지 효력을 발할 수 있게 할 것인지, 스테이트의 exit 시간 사이에만 효력을 발할 수 있게 할 것인지를 설정합니다.

즉, 애니메이션 스위치가 켜졌는데, 아직 프레임이 끝나지 않았다면 계속 플레이하고 프레임이 끝난 뒤 애니메이션 스위치가 명령하는대로

따른다는거다

공격모션 같은 경우는 바로 공격이 나가야되기 때문에 이 박스를 체크 해제 해줘야 한다

 

그리고 스크립트를 하나 만들어서

무기에 달아주자

 

 

 

요렇게 작성하면 된다.

public으로 Animator변수를 만들어주고,

무기에 붙여둔 Animator를 넣어주면된다

 

그리고 마우스 클릭시(명령 입력시)

Animator의 setBool로 "bool값이름"이 true로 되는거다

 

아,

Debug 부분이나

GetComponenet<Animator>~ 이부분은 테스트용으로 쓴거라 입력하지 않아도 된다...ㄷㄷ

 

참고로 'bool값이름'에서 대소문자를 주의하자 Up을 UP으로 써놨다가 작동이 안되서 이것저것 테스트를...

 

그리고 함수를 하나 만들어서,

AttackEnd라는 이름으로 만들어주자

 공격이 끝났을때 다시 idle로 되돌아오기위한 함수다

아까와 마찬가지로 bool값을 조절하는 함수를 써주고 false로 만들어준다

 

그리고 다시 Animation텝으로 와준다

물론 Axe_Up이다



좌측 상단 메뉴중에 가장 오른쪽, 작은 네모와 +기호가 있는 아이콘을 클릭하자

이때 프레임은 공격모션이 끝나느 60프레임에 맞추자

 

다시 요걸 우클릭해보면 (작아서 힘들ㄷ...) 위와 같은 메뉴가 뜨는데 Edit Animation Event를 클릭한다음

 

 

함수를 AttackEnd()로 만들어준다

 

즉, 설정한 시간이 되면 (60프레임) 해당 함수를 동작시킨다

 

 

 

 

클릭하면 휘두른다 (Axe_Up의 진행상황이 파란색 게이지로 표시된다)



 

모션이 끝나면 AttackEnd()함수가 발동해서 Axe_idle로 되돌아온다

 

 

위 내용대로,

애니메이션을 다시 만들고 코딩도 손봤다

 

방패따로, 무기 따로 만들경우 합치는데 고생이 되버려서..

 

특히 방패를 막는 도중엔 무기를 사용할 수 없게 만드려면 한꺼번에 하는게 편하다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using UnityEngine;
using System.Collections;
 
public class Action : MonoBehaviour {
 
    public Animator _animator;
 
 
    private bool _isMove = false;
 
    private float _originMouseX;
    private float _originMouseY;
    private float _lastMouseX;
    private float _lastMouseY;
 
    private float _deltaX;
    private float _deltaY;
 
    void Update () {
    
        if (Input.GetMouseButtonDown (0) && _isMove == false
        {
            _isMove = true;
            _originMouseX = Input.mousePosition.x;
            _originMouseY = Input.mousePosition.y;
        }
        if (Input.GetMouseButtonUp (0)) 
        {
            _lastMouseX = Input.mousePosition.x;
            _lastMouseY = Input.mousePosition.y;
 
            SwingChk ();
        }
        if (Input.GetMouseButtonDown (1) && _isMove == false
        {
            _isMove = true;
            _animator.SetBool ("isBlock"true);    
        }
        if (Input.GetMouseButtonUp (1)) 
        {
            _animator.SetBool ("isBlock"false);    
            _isMove = false;
        }
    }
 
 
    void AttackEnd()
    {
        _animator.SetBool ("isDownAtk"false);
        _animator.SetBool ("isRightAtk"false);
        _animator.SetBool ("isLeftAtk"false);        
        _animator.SetBool ("isTrustAtk"false);
 
        _isMove = false;
    }
 
 
    void SwingChk()
    {
        _deltaX = _lastMouseX - _originMouseX;
        _deltaY = _lastMouseY - _originMouseY;
 
        if (Mathf.Abs (_deltaX) > Mathf.Abs (_deltaY)) 
        {
            if (_deltaX > 0
            {
                _animator.SetBool ("isLeftAtk"true);
            } 
            else if (_deltaX < 0
            {
                _animator.SetBool ("isRightAtk"true);
            }
 
        } 
 
        else if (Mathf.Abs (_deltaX) < Mathf.Abs (_deltaY)) 
        {
            if (_deltaY > 0
            {//TrustAtk
                _animator.SetBool ("isTrustAtk"true);
            } 
            else if (_deltaY < 0
            {
                _animator.SetBool ("isDownAtk"true);
            }
        }
 
    }
}
 
 
cs

 

728x90

'유니티 > 실습' 카테고리의 다른 글

주말 숙제 - 1인칭 게임 - 4  (0) 2022.02.13
주말 숙제 - 1인칭 게임 - 3  (0) 2022.02.13
주말 숙제 - 1인칭 게임 - 1  (0) 2022.02.13
유니티 UI만들기  (0) 2022.02.13
주말 숙제 - 비행기게임  (0) 2022.02.13