SFX의 Pitch를 등차수열적으로 Info 라는 값에 의해서 변형되도록 하기 위한 코드를 작성하던중 지속적으로 SFX의 Pitch 값이 변경되지 않는 문제가 발생하였고, 해당 과정에서 발견한 문제의 원인과 해결 방안에 대한 기록.
배경
Info 값의 경우 타입이 int
audiosource의 pitch 의 경우 float
문제
audioSource.pitch =1+ Info / 10;
위와같은 형태의 코드로 pitch 값을 주어지는 Info 라는 int 값에 따라 변경시켜서 SFX 를 재생시키려 했는데,
해당 과정에서 지속적으로 pitch값이 1로 출력되는 것을 확인함.
테스트
Debug.Log("1 + Info / 10 => " +(1 + Info / 10));
Debug.Log("1f+ Info / 10 => "+(1f + Info / 10));
Debug.Log("1+(float)Info/10 => "+(1 +(float)Info/10));
Debug.Log("1f+(float)Info / 10 => "+(1f +(float)Info / 10));
위와 같은 경우들을 모두 출력해보면 나오는 값은,
1
1
1.3
1.3
이때에, 그냥 1 의 경우, 1은 System.Int32
1f 는 System.Single
Info/10 은 Info 도 System.Int32, 10 도 System.Int32
결국 Info/10 의 경우 int 와 int 의 연산으로 int 로 반환. 이 경우 예를들어 Info == 3 인 경우, 3 / 10 은 0 으로 반환.
원인
위와 같은 4가지 경우들을 테스트 해보았을때, 문제가 되던 부분은 Info / 10 의 부분에서 float 을 반환해야 하는데 int 끼리의 연산으로 int 를 반환하는 문제가 핵심적인 원인.
해결방안
float 을 다루는 값의 대입의 경우, 내가 연산을 처리하는데 사용하는 타입들이 float인지 int 인지 등을 잘 파악하고, int 끼리의 연산을 통해서는 int 의 반환이라는 것을 주의하고 잊지 말도록 하자.
알고리즘을 많이 풀때는 타입에 대해서 신경을 많이 쓰면서 코드를 작성했던것 같은데, 한동안 PS 에서 손을 떼어서 그런지 기본적인 이러한 타입에 대한 고려를 하지 못한듯 하다. 코드 작성시에 타입에 대한 고려는 가장 먼저 기본적으로 밑바탕으로 두고 코드를 작성할 수 있도록 습관화 하도록 하자. 혹시 이와 같은 중요한 타입의 고려를 처음에 하지 못하고 코드를 작성하였더라도, 문제 발생시 해결 방안을 찾아나가는 과정에서, 타입에 대한 체크를 해보는 습관을 들이도록 하자.
현대의 코드에디터의 경우 마우스를 해당 값에 호버링 해놓으면 타입이 어떤것인지 잘 나온다.
