확장 메서드란 구조체나 클래스에 기능(함수)을 확장 시켜 사용하는 것
public static 리턴타입 함수명(this 확장할 데이터타입 변수명 , 매개변수들...)
public static IEnumerator ShakeCamera(this Camera shakecamera , float shakeTime, float shakeIntensity)
{
Vector3 offset;
for(float time = 0 ; time < shakeTime; time += Time.deltaTime)
{
offset = Random.insideUnitSphere * shakeIntensity;
shakecamera.transform.position += offset;
yield return null;
shakecamera.transform.position -= offset;
}
}
카메라의 흔들림은 몇초간 지속 되었다 꺼져야 해서 리턴타입을 코루틴으로 사용했다. 그리고 확장할 데이터타입은 Camera로 사용을 했다.
이제 매개변수 두개를 받는데 흔들릴시간과 , 흔들림의 강도가 필요했다.
: shakeTime, shakeIntensityVector3 offset으로 백터를 생성해주고
for 문은 shakeTime 만큼 돌수있게 한다.이제 offset의 값에 Random.insideUnitSphere * 흔들림강도 를 넣어준다. 여기서 insideUnitSphere는 구형태의 반경 안에서 랜덤 위치를 지정해주는데 흔들림의 강도만큼 구형태에서 랜덤값이 정해진다.
지정한 데이터타입 camera의 포지션에 offset을 더해주고 다시 빼주는 형태를 반복한다.
public class Test : MonoBehaviour
{
public float shakeTime;
public float shakeIntensity;
void Update()
{
if(Input.GetMouseButtonDown(0))
{
StartCoroutine(Camera.main.ShakeCamera(shakeTime, shakeIntensity));
}
}
}
이제 다른 스크립트에서 두가지의 변수만 선언해주면 사용이 가능해진다.
shakeTime : 흔들릴 시간
shakeIntensity : 흔들림의 강도두개의 float 값을 받아서 마우스를 입력시 사용가능 하게
코루틴을 호출후 Camera.main 에서 . 을 찍게 되면
만들어둔 확장메서드인 ShakeCamera를 사용할수 있게 된다.StartCoroutine(Camera.main.ShakeCamera(shakeTime, shakeIntensity));