Survival Shooter 플레이어 캐릭터




케릭터의 기본 설정을 해보도록 하겠습니다.


플레이어 모델을 드래그해서 Hierarchy로 드래그하고 기본값을 (0,0,0)으로 설정합니다.



Player에 Player태그를 줍니다.

그러면 플레이할때 적절한 동작을 취합니다.





이동, 방향 전환등의 애니메이션 효과를 위해

애니메이션 파일을 Assets 하위폴더로 만들어로 만들어줍시다.


PlayerAC로 이름을 변경 후 다음과 같이 설정.




PlayerAC를 더블클릭하여 애니메이터 창을 열어 줍시다.


 



드래그해서 넣어줍니다.



Idle 오른쪽 클릭후Set as Layer Default State선택




오른쪽 상단 Prameters에서 +버튼을 눌러 IsWalking(boolean타입), Die(Trigger 타입) 2개를 만듭니다.

여기서 

boolean - 참 or 거짓

Trigger - 참 or 거짓을 가지지만 boolean과는 달리 참으로 설정한 시점을 거짓으로 재설정 합니다.

             Trigger하고 저절로 리셋되길 원하는 경우에 유용합니다.




Idle 에서 move 로 트렌지션을 설정합니다.



흰색 화살표(트렌지션)을 누르면 오른쪽 상단에 다음과 같은 창이 뜹니다 

Conditions에서 +를 눌러 사진과 같이 설정.





다이는 true , false를 정해줄 필요가 없습니다.




물리효과를 위해 Player의 Rigidbody를 만들어 주고 

시간이 지나도 느려지지 않게 Drag, Angular Drag를 Infinity로 설정해줍니다

(inf ->enter 시 바로 Infinity로 설정됨 꿀팁)

그리고 Constraints를 이용해 캐릭터가 쓰러지거나 굴러 떨어지지 않도록 y를 고정 시킵니다.



장애물충돌 효과 및 충돌시 작은 비명소리를 위한 설정

Play on Awake를 체크할시 게임 시작과 동시에 플레이어의 비명소리가 들리기 때문에

체크 해제를 합니다.



스크립트를 Player에 드래그해서 넣어 줍니다.




이제 스크립트를 열어 코드를 적어보겠습니다.




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
using UnityEngine;
 
public class PlayerMovement : MonoBehaviour
{
    //언제든 조절할수 있는 변수 설정
    public float speed = 6f; //플레이어의 속도를 컨트롤 기본값이 6
 
    Vector3 movement; //플레이어에게 적용하려는 동작을 저장
    Animator anim; // 애니메이터 컴포넌트의 참조를 지정
    Rigidbody playerRigidbody; //리지드바디 컴포넌트도 참조
    int floorMask; //커다란 사각형 레이캐스트  레이캐스트가 플로어와만 충돌할 수 있다.
    float camRayLength = 100f; //카메라에서 발생하는 광선의 길이
 
    //Awake함수는 Start함수와 유사하지만 스크립트 활성 여부와 상관없이 호출 따라서 참조 설정등에 유리하다.
    void Awake()
    {
        floorMask = LayerMask.GetMask("Floor");  //floorMask를 설정
        anim = GetComponent<Animator>(); //애미네이터 참조 설정
        playerRigidbody = GetComponent<Rigidbody>();
    }
 
    //FixedUpdate() 스크립트에서 자동으로 호출되는 함수, 물리효과와 함께 실행
    void FixedUpdate()
    {
        float h = Input.GetAxisRaw("Horizontal"); //유니티에서 지원해주는 Horizontal기본값으로 사용한다
        float v = Input.GetAxisRaw("Vertical");  //유니티에서 지원해주는 Vertical 기본값으로 사용한다
 
        //우리가 생성한 함수들을 호출
        Move(h, v);
        Turning();
        Animating(h, v);
    }
 
    void Move(float h, float v)
    {
        //앞서 저장한 vector설정
        movement.Set(h, 0f, v); //수직컴포넌트는 원하지 않으니 0f , x,z는 바닥과 수평을 이루게 된다.
 
        //어떤 키조합을 사용하더라도 플레이어가 같은 속도로 이동할 수 있도록 한다.
        //플레이어가 우리가 원하는 속도로 이동하게 우리가 저장한 속도 변수에 곱한다.
        //deltaTime 각 Update 호출의 시간 간격. 초단위가 되도록 설정
        movement = movement.normalized * speed * Time.deltaTime;
 
        //이 움직임을 플레이어에게 전달
        //캐릭터의 현재위치에 비례해 리지드 바디를 이동
        //플레이어의 현재위치에서 이 입력을 더한 것과 같다. 캐릭터를 조금더 이동시키기 위해 부여한 값.
        playerRigidbody.MovePosition(transform.position + movement);
    }
    //[Turning]캐릭터가 바라보고 있는 방향은 우리가 이미 저장한 입력이 아니라 마우스 입력을 기준으로 한다.
     
    void Turning()
    {
        //카메라에서 씬으로 발사하는 광선을 생성
        //케릭터가 바라보고있는 곳의 포인터를 캐릭터가 턴하여 바라보게 한다. 
        //게임 마우스 포인터에 따라 캐릭터는 돌서면서 해당 위치를 바라보고 돌아서면서 특정 방향으로 쏠수도 있다.
        Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
 
        RaycastHit floorHit;
 
        //생성한 Ray를 쏘는것
        //가공의 이 보이지 않는 선을 만든다.
        //광선이 가지려는 위치와 방향, 길이
        if(Physics.Raycast(camRay, out floorHit, camRayLength, floorMask))
        {
            //플로워를 맞히는 포인터 - 플레이어의 위치
            Vector3 playerToMouse = floorHit.point - transform.position;
            //플레이어가 방향을 정할수 있도록
            playerToMouse.y = 0f;
 
            //벡터를 기준으로 플레이어를 회전할수 없으므로 벡터에서 Quaternion으로 변경해준다.
            Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
            playerRigidbody.MoveRotation(newRotation);//완전히 새로운 회전
        }
    }
 
    //애니메이션
    void Animating(float h, float v)
    {
        //수직축 , 수평축 둘중 하나를 눌렸느냐? 하나라도 누르면 걷겠다.
        bool walking = h != 0f || v != 0f;
        anim.SetBool("IsWalking", walking);
    }
}
 
cs



게임 실행 










+ Recent posts