목차
- 카메라가 보는 방향을 플레이어의 방향으로 만들기
- 플레이어에게 중력 적용 시키기
- 중력 넣음으로써 파생되는 문제 해결 (중력 누적)
- (Mission 1) 점프가 연속으로 계속 되는 문제 해결
- (Mission 2) 2단 점프 만들기
- (Mission 3) 총알 만들어서 발사하기
- 총 만들기
- RayCast
- Effect 넣기
카메라가 보는 방향을 플레이어의 방향으로 만들기
`
플레이어가 카메라가 바라보는 쪽으로 가고싶음!
그니까 현재 글로벌 방향으로가지, 카메라가 바라보는 시점으로 가지는 않는다
(Camera.main 는 Tag 가 Main Camera 인 카메라를 의미한다)
dir = Camera.main.transform.TransformDirection(dir); 를 추가!!
(참고) 블렌더나 마야에서 부러워하는 유니티의 특징
이 실시간 렌더링 (움직이게 하는거) 라는게 원래 말이 안됨. 블렌더나 마야나 이런데는 원래 한장 한장씩 찍어서 움직이는것 처럼 생산해냈었음. 그마저도 하나하나 찍는게 오래 걸렸음.
근데 유니티는 그냥 움직이게 하는게 엄청 쉬움. 이처럼 유니티를 만들생각을 한 20% 가되서 세상을 바꾸자!
여기서 문제 => 공중으로 뜨는 문제가 생긴다. 카메라가 위를 바라보고 앞으로가면 위로 날라간다
중력을 만들어내자!
유니티에서는 Gravity 값은 -9.81 로 작용하지만
우리는 그렇게 쓰지 않는다. => 우리가 원하는 효과를 낼 수 없기 때문!
우리가 중력까지 적용시켜 보자! => 그래서 RigidBody 가 아닌 CharacterController 도 쓴다
중력을 적용시키기 위해서는 Update() 에 yVelocity += gravity * Time.deltaTime; 을 해주면 됨!
중력이 누적되는 문제
그런데 여기서 문제가 있음
여기서 떨어지면, 바로 순간이동하는것 처럼 떨어짐,, 왜? 중력이 계속 누적 되기 때문,..
원래 인간은 중력을 계속 받지만, 지면에 있어서 중력의 크기만큼 수직항력을 계속 받고있음.
그렇기 때문에 속도는 0 이된다
하지만 지금 저기 위에 있는 플레이어는 중력을 계속 누적해서 받고 있는 상황임!!
그렇다면 바닥에 닿아 있을때, 수직속도를 0으로 만들어 주면 됨!
(참고) CharactoerController 의 메서드 isGrounded
CharacterControl 에 isGrounded 라는 함수가 있다.
이 cc.isGrounded 는 below 와 바닥이 닿아있다면, 이라는 뜻임
즉,
if(cc.isGrounded) = if(cc.collisionFlags == CollisionFlags.Below)
(참고) Collider 의 Below 부분
![](https://blog.kakaocdn.net/dn/z5kCB/btrIADvEL5v/ypjMpAa5gKSNwau2tWsFW1/img.png)
여기서 상단 중단 하단 부분 3가지로 나뉘어 진걸 볼 수 있는데, 그중 하단부가 Bellow 이다.
여기서 이해할 수있는 RigidBody 와 CharacterController 의 차이점
cc.Move( dir * speed * Time.deltaTime )
이 상태는 점프방향. 즉, dir.y 방향까지 speed 값이 적용되는 것이다.
만약 여기서 speed 를 빼고,
cc.Move(dir * Time.deltaTime) 으로 쓰고 점프를 해보면
우리가 알던 RigidBody 로 점프하는 느낌이 든다! (약간,, 붕뜨는..?)
근데 우리는 그런 느낌이 싫어서, 저기에 Speed 도 넣고 하는것이다. 훨씬 부드럽고 빠르게 점프하고 중력값을 받는다!
점프코드의 위치
그렇다면
yVelocity = jumpPower;
코드를 어디에 넣어주면 될까?
점프는 이동의 일부분 떄문에 여기 밑에 쓰면 안됨. 이동하는 스크립트가 위에 있으면 적용이 안되니까.
그러니까, yVelocity 에만 영향을 주자!
여기 보이는 if문 안에 넣어서도 안된다.
저기 if문 안에 dir.y = yVelocity; 를 넣어봤자 yVelocity = 0; 이 있기 때문에 소용이 없어짐
이쪽에 넣어주면 제대로 영향을 받으면서 활용 가능하다!
점프가 연속으로 계속 되는 문제
여기서 문제
스페이스바를 누르면 점프가 계속 됨!!
Mission 1 해설
시도를 해봤다면,
점프코드를 이런식으로 넣었을 수도 있다,
이 코드의 문제점. 될 떄가있고 안될 때가 있음.
즉, 뭔가 씹히는 코드이다
print() 를 넣어봐도, 언제는 되고 언제는 안된다.
그렇기 때문에 bool 변수를 넣어 좀 더 개선이 잘 되게 만들자!
강사님 방법
1. bool 변수 선언
2. if 문을 밖으로 뺀 다음, 점프상태를 추가 시키면 훨씬 입력을 잘 받는다.
2단 점프 만들기
그렇다면 공중에서 한번 더 점프하는 2단 점프는 어떻게?
Mission 2 해설
점프카운트를 만들어서 조절 해보자!
카운트가 Max카운트보다 커지게 되면 점프가 안되게 조절 하면 됨!
1. 변수선언
2. 코드 작성
바닥에 착지했을 때는 Count 를 0 으로 초기화 해주고
점프 할때만 카운트를 올려줌
총알을 만들어서 발사해보기
Bullet 생성후 , Prefab 만들고
bullet.cs , PlayerFire.cs 생성
PlayerFire.cs
여기까지는 우리가 아는 부분인데 RigidBody 를 이용해서 하려면 어떻게 해야할까?
Mission 3 해설
1. Bullet 을 만든다
2. Bullet.cs 생성 한 후, Bullet 에 넣어줌
3. 속도 변수 넣어주고, 시작할 때 속도만 던져주면 됨!!
( 우주에서 속도 한번만 주면 영원히 가는것 처럼)
그래서 Start() 에서 저 두 코드중 하나만 써주면 쭉 날아감!
4. PlayerFire.cs 에 변수를 선언해준다
지금은 firePosition 에 Camera를 넣을 예정!
5. PlayerFire.c s를 생성하고 Player 에게 넣어준다
ShootBullet() 함수를 만들고 Update 에 넣어준다
(참고) Istantiate 에서 방향이나 이런것들 추가 하는것도 가능함!
![](https://blog.kakaocdn.net/dn/bdqrzT/btrIFIQ6iMt/mvpT8P5a5b2sFLrIkrdj6k/img.png)
같은 함수들인데 추가기능들이 더 붙은 모습들이 보인다.
이걸 함수의 오버로딩이라고 한다
(참고) 함수의 오버로딩과 오버라이딩
[함수의 오버로딩]
Instantiate 의 함수에는 다양하게 존재한다. (이걸 오버로딩 이라고 함!)
같은걸 여러개를 쌓는다고 해서 오버로딩임!
![](https://blog.kakaocdn.net/dn/b5B04s/btrIMCbzUv0/Vxr9aKKu4MBK5KohubN211/img.png)
[함수의 오버라이딩]
함수의 오버라이딩은 덮어쓰기 라고 함!
![](https://blog.kakaocdn.net/dn/44CUt/btrILeB3idn/DmGECrUKC6f53Rfx1hRjxK/img.png)
자식이 부모꺼를 쓰지 않고 내꺼를 쓰기위해서 덮어씌우는걸 Overriding 이라고 함
이 오버라이딩을 하기위해서는 키워드가 들어감. 반듯이 부모꺼를 써야할 경우가 있음.
![](https://blog.kakaocdn.net/dn/oJbb1/btrINuK5W7S/2nk1rS6fEZoCdqYJkI6ms0/img.png)
![](https://blog.kakaocdn.net/dn/CCfdR/btrIFHRR46c/ZHay4Su0OqPRP6ug8TbSkK/img.png)
![](https://blog.kakaocdn.net/dn/siDq5/btrINMYSjAN/PmynroJWKxirlkgUgRLy6k/img.png)
어떤 하드웨어를 만들지는 모르겠어, 근데 UIB 를 꼽으면 커넥트라는 함수가 나온다고 치자.
근데 부모입장에서는 할 수가 없음 자식이 만들어서 할거임.
하은이가 만들려는 USB 디바이스가 있고 다른애는 다른걸 만들고 싶고 종류별로 다다릉ㅁ 근데 내이 ㅂ장에서는 자식들이 뭘 만들지모르는데 커넥트 뭐 이런걸 해줄 수가 없음. 그니까 버츄얼로 커넥트를 만들어 놓고
자식이 그 커넥터를 갖다 쓸거임.
부모가 걷기를 써놓으면 부모꺼를 쓰는거고, 내가 Override 를 하면 내꺼를 쓰는거고.
객체지향에서 다형성과 같이 연결되서 봐줘야지 같이 쓸 수 있음.
다형성 공부해보면서 이 Virtual 을 공부해보면 쉽게 알 수 있을거임.
여튼 중요한건 Virtual 은 미래를 위해서 만들어 놓은 거임
(참고) 베이지어 곡선
![](https://blog.kakaocdn.net/dn/3fBVj/btrIPWNMEV1/CiVtGeb4XCmkOPKKZMILZ1/img.png)
이걸로 유도탄이나 그런 물리환경을 만들 수 있음!
총 만들기
메인카메라 자식으로 Cube 를 생성하고 Gun 이라고 이름을 만들자
Game 화면에서 Gun 이 짤리면, Camera 의 Near 를 줄여준다!
그 후에, Gun 의 자식으로 빈 오브젝트를 만들어 FirePosition 으로 이름을 짓는다.
위치는 Gun 의 총구!
아까 만들었던 PlayerFire 에 Fire Position 에 넣음!
(참고) FPS 게임과 거울
우리 게임상에서는 Player 는 손만 나오게 하지만, 게임상에서 거울을 보면 케릭터가 나오게 한다.
Camera 에서 Culling Mask 를 보면 특정 레이어만 그리게 할 수 있다!
![](https://blog.kakaocdn.net/dn/bbudiV/btrIO1IBvgX/5f9BDTGJAlkZSEChhKKCtk/img.png)
RayCast
실제로 총을 쏘으면 총알이 눈에 보일까?
실제로는 안보인다. 맞았을때만 보인다!
이번에는 RayCast 에 대해 알아보자!!
---
이제는 총알이 아니라 Ray 를 쏠거기때문에 ShootBullet 을 잠시 빼놓자
총구의 위치에서 레이를 쏴도 되는데, 정중앙으로 쏠려면 카메라가 바라보는 화면에서 정중앙이니까
카메라에서 시작한다고 생각하자!
new Ray ( 카메라의 위치, 카메라의 앞방향 )
그 후, 부딪힌곳 도 확인하기
근데 Out 을 넣어서 쓸 수 있음! Call by Reference 관련 내용임
Out 이라는게 있어서, out hitInfo 해줘야 가져올 수 있음
참고) Call by Value, Call by Reference , ref 와 out 키워드
Call by Value , Call by Reference
https://developer-talk.tistory.com/52
[C#]Call By Value, Call By Reference
Call By Value, Call By Reference C#에서는 함수 또는 메서드를 호출하는 두 가지 방법이 있습니다. 첫 번째는 "Call By Value(값으로 호출)"이고 두 번째는 "Call By Reference(참조로 호출)"입니다. 두 방법..
developer-talk.tistory.com
https://developer-talk.tistory.com/53
[C#]ref와 out 키워드
ref와 out 키워드 ref 및 out 키워드는 메서드 또는 함수 내에서 인수를 전달하는 데 사용됩니다. 둘 다 인수 / 매개 변수가 참조로 전달되었음을 나타냅니다. 공통점 ref와 out은 런타임에 다르게 처
developer-talk.tistory.com
Effect 넣기
구글 드라이브에서 강사님이 올려주신 Effect 패키지를 가져온다
이 프리팹을 껐다 켰다 할꺼임
오브젝트 풀 을 쓰는 것도 메모리 낭비를 안하기 위해 딱 잡아놓고 재활용해서 쓰는거임
근데 이것도 막 쓰는건 낭비이다. 하나만 쓸 수 있으면 껐다 켰다 하는게 좋음!
1. 변수 설정 해주고 (위치 , 파티클 시스템)
2. RayCast 에 부딪힌지점으로 파티클이동, 위치는 면의 수직인 방향인 normal 방향 , 그리고 파티클을 Stop & Play 를 시킴! (재생중인게 있을 수 있으니까, Stop & Play 함!)
3. 사운드 넣기
Effect 에 보면 사운드도 있음
맞지 않아도 소리는 나야하기 때문에 여기에 써줌!
(참고) slope 타고가는 플레이어 만들때도 RayCast를 쓰면 만들 수 있음!
![](https://blog.kakaocdn.net/dn/c4tJxk/btrIISyZPQ5/iyt4qSyHME4d2iKGDAiQJ0/img.png)
![](https://blog.kakaocdn.net/dn/eKecti/btrICOqo03q/VwVDezqYOafWjKwpOekD41/img.png)
(참고) MMORPG 같은데서 마우스로 클릭해서 플레이어 이동하게 하는것
![](https://blog.kakaocdn.net/dn/btgVu6/btrIOwWtgWE/qK5efukjltdwva4LK9JT11/img.png)
'3D_FPS' 카테고리의 다른 글
08_09 (주석처리 설정, 공격 이벤트,피격,Die 애니메이션 구현 ) (0) | 2022.08.09 |
---|---|
08_08 Enemy_Animation (Idle, Move, Attack) (0) | 2022.08.08 |
08_05 Enemy_(Move,Attack,Die) (0) | 2022.08.05 |
08_04 (Enemy 생성, FSM 구현, Idle 구현) (0) | 2022.08.04 |
08-02 (3D_FPS) CamRotate.cs, PlayerMove.cs 생성 (0) | 2022.08.02 |