발자국 소리 만들기

by 1월 25, 2022 0 comments

원리 : 

1. 캐릭터의 발에 Collider 추가 (각각 발에 따로따로)

2. 해당 콜라이더(발)가 바닥지형과 충돌할경우 사운드 재생 (Trigger or Collision 으로 체크)

오디오 에셋으로 MasterAudio 를 사용중이여서 코드 없이 footstep를 추가할 수 있습니다. 
그러나 땅 위에 풀이나 물이 있을경우에 둘다 충돌처리가 되기때문에 2중으로 호출됩니다. 
현재 해당 컴포넌트에서는 이런것에 대한 처리가 불가능합니다. (땅 위에 풀이 있는게 아닌, 땅과 풀이 확실히 분리된다면 쉽게 구현가능합니다.)


각 발에 아래 FootStep 스크립트 추가해서 발바닥이 지형과 부딪치는지 검사합니다. 

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
public class FootStep : MonoBehaviour
{
    public GameObject Player;
    bool isRightFoot = false;
 
    void OnTriggerEnter(Collider other) {
 
        //발자국 소리를 표시할 바닥의 레이어를 가져온다. 
        string layerName = LayerMask.LayerToName(other.gameObject.layer); if(layerName == "Ground" || layerName == "Water" || layerName == "Rock" || layerName == "Gress"){
            //현재 플레이어의 위치를 가져온다.
            WalkingOn walkingon = Player.GetComponent<PlayerController>().WalkingOn;
 
            //왼발 오른발에 따른 소리를 변경해준다.
            string postFix = "_l";
            if(isRightFoot)
                postFix = "_r";
 
            switch(walkingon) {
                case WalkingOn.Grass:
                    MasterAudio.PlaySoundAndForget("footstep_gress" + postFix);
                    break;
                case WalkingOn.Water:
                    MasterAudio.PlaySoundAndForget("footstep_water" + postFix);
                    break;
                case WalkingOn.Rock:
                    MasterAudio.PlaySoundAndForget("footstep_rock" + postFix);
                    break;
                case WalkingOn.Ground:
                    MasterAudio.PlaySoundAndForget("footstep_default" + postFix);
                    break;
            }
        }
    }
}

cs


플레이어에 아래 스크립트 추가해서 플레이어가 특별한 지형과 충돌하는지 체크
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
public enum WalkingOn
{
    Grass,
    Water,
    Ground,
    Rock
}
 
public class PlayerController : MonoBehaviour
{
    public WalkingOn WalkingOn = WalkingOn.Ground;
 
    void OnTriggerEnter(Collider other)
    {
        string layerName = LayerMask.LayerToName(other.gameObject.layer);
        switch (layerName)
        {
            case "Grass":
                WalkingOn = WalkingOn.Grass;
                break;
            case "Water":
                WalkingOn = WalkingOn.Water;
                break;
            case "Rock":
                WalkingOn = WalkingOn.Rock;
                break;
            default:
                break;
        }
    }
 
    private void OnTriggerExit(Collider other)
    {
        string layerName = LayerMask.LayerToName(other.gameObject.layer);
        switch (layerName)
        {
            case "Grass":
            case "Water":
            case "Rock":
                WalkingOn = WalkingOn.Ground; 
                break;
        }
    }
}
 
cs

충돌체크를 통하여 발자국 소리를 재생하기 때문에 애니메이션 속도가 빠른경우에 사운드가 많이 출력되어서 이상할 수 있습니다. 
이럴경우 사운드를 재생할때 어느정도 간격을 주어서 해결을 하면 됩니다.