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