본문 바로가기

3D_FPS

8_18 (속성 사용) CameraShakeBase,CameraShake, CS_Random, CS_Sine

목차


CameraShakeBase 속성 틀 만들기

 

이렇게 3가지를 알아볼거임!

 

CameraShake 폴더를 하나 생성!

 

이제 틀을 만들거임!

CameraShakeBase 스크립트를 생성하고, 

자식에서 쓸 변수와 함수를 만들거임!! 

여기서 다른데서 쓸거를 정리한다고 생각하자!

공통으로 쓰일 변수들같은거 선언

상속 이용해 볼거임!

Monobehaviour 지움

MonoBehaviour 를 지우자!

MonoBehaviour 의 상속을 안받아도 됨!

이게 부모클래스가 될 예정이기 때문!

 

다 지운 상태!

class 위에 struct (구조체) CameraShakeInfo 코드를 넣는다!

여기에다가 이제 shake 에서 쓸 변수들을 넣을거임!

나중에 에디터에서 이 변수들을 수정해서 카메라 흔들림을 조정해야함!

구조체를 에디터에 노출 하고싶을때는 System.Serializable 을 넣는다!

나중에 이 구조체를 다시 선언 할건데,

그때 선언 하면서 [SerializeField] 까지 넣어주면

구조체 에디터에 나오게

나중에 에디터에서 이렇게 볼 수 있다!


CameraShakeBase 클래스로 다시 와서

카메라가 흔들리고나서 다시 초기위치로 가야하니까, 초기위치 기억변수를 넣자!

 

(초기위치로 가지 않으면 흔들려있는채로 멈출거임! 이상한데를 바라보면서)

 

위치나 다른 속성을 다시 초기화 시켜줄 수 있는 Init 을 만들자.

미래에 쓸 예정이라 오버라이딩을 위해 virtual 을 사용!

 

(참고) 부가설명

더보기

그니까 이제 Init 이라는 이름의 함수를 다른 스크립트에서 쓸 예정인데

CS_Random 에서도 Init 이라는 이름의 함수를 쓸거고

CS_Sine, CS_Animation 에서도 다 같은 이름의 함수를 쓸거임

근데 같은 함수라서, 똑같은 이름, 비슷한 역할을 할 건데

CS_Random , CS_Sine, CS_Animation 에서 구현하는 방법은 당연히 다르겠지?

 

그럴 때 오버라이딩을 하는거임

 

재생함수와 정지함수도 생성!!

Init 뿐만 아니라, Play, Stop 도 오버라이딩으로 생성!

 

this.origiinnPos 는 내꺼,

그냥 originPos 는 함수안에 있는 originPos!!


CS_Random 생성

 

이제 카메라쉐이크 랜덤을 생성해보자!

스크립트 생성!

생성!

 

CameraShakeBase 를 상속받는 CS_Random 을 생성!!

MonoBehaviour 를 지우고 CameraShakeBase 를 넣자!

그래서 CameraShakeBase 에 있는 변수들과 선언된 함수들을 이용할거임!

 

 

잠시 CameraShakeBase 에 가서 이거 protected 로 바꿈!!

보호시켜서만 쓸거임!

 

(참고) 접근 제한자

 

 

여기에서 CS_Random 에서 쓸 Play 와 Stop 의 함수들을 정의 한다.


CameraShake.cs 생성

이제 여기서 

만들어진 Shake 의 함수를 호출할거임!

 

카메라를 넣어줄 수 있는 스크립트를 만들어야 함!

이거 생성하고
메인카메라에 넣자!

 

새롭게 만든 모습

CameraShakeType 을 넣어서 나중에 에디터에서 선택하게 만들거임!

이런식으로

 

객체지향의 '다형성' 임

이씨 를 부르면 이씨들이 다 나와서 하는것 처럼, 부모안에 있기 때문에 그게 실행 될 수 있음!

 

 

그렇기 때문에 virtual override  쓴거임!

그니까, 

여기에서 Play() 함수를 선언만 하고 다른 CS_Random 뭐 이런데서 다시 재정의 해줬었음

그러면 원래는 CS_Random 에 있는 함수를 불러줘야 사용할 수 있는거 아닌가?

라고 생각 할 수 있지만

 

그냥 그 부모(CameraShakeBase) 에 있는 Play() 를 불러서 사용해도 됨!

어떤식으로 이루어 지는지 알아보자


Factory Method 로 스크립트를 생성한다!

 

이렇게 시작할 때 생성하게되면

부모에 있는 Play 를 불러도 그 자식(생성된) 에 있는 Play 함수가 호출 되는거임!

 

이제 어떤 카메라를 쓸지 Fatory Method 를 이용해서 사용해보자!

Factory Method 로 작성

팩토리 메소드는 객체생성역할을 함.

CS_Random() 을 return 하고있음. 이게 객체지향의 다형성 때문임!

시작할때 실행해줌!

이게 있어야 컴퓨터가  Play 중에 어떤 종류의 Play 를 실행시켜 줄건지 알 수 있음

Random? Sine?

 

그리고 시작 지점도 정해주고.

 

이제 코루틴을 만들어서 실행 하게 해보자!

 

이 코루틴을 만들어 보자!!

 

이 방식은 Random 방식과 Sin방식에서만 사용 할거임!

 

 

여기 있었던 시작지점을 

 

처음포지션을 다시 최신화 시켜주는거임!!

여기로 이동시켜주자!

플레이 할 때마다 시작지점을 정해야함!

그래야 플레이가 끝나고 클릭을 눌렀던 지점으로 갈 수 있음!

 

애니메이션이나 다른건 코루틴으로 하면 안되기 때문에 Type 에 따라서 실행 방법을 다르게 해보자!

Animation 은 Coroutine 으로 실행하지 않을거임!

 

TargetCamera 자기 자신 넣고

Amplitude 를 15 정도로 넣고 실행해보면 화면이 흔들리는걸 확인 할 수 있음!


CS_Sine 생성

 

Sine 으로 Shake 해보기!

 

Random 복제해서 Sine 으로 만들자!

 

 

Base 에서 또 변수 추가해주기
Sine Play, Stop 완성!
CameraShake 에서 이제 SIne 스크립트 생성해서 넘겨주기

sine 으로 할 때는 Amplitude 를 엄청 적게 놓고

Sin Speed 값을 좀 키워줘야 이쁘게 나옴!