일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스파르타내일배움캠프
- 내배캠
- Til
- input system
- 백준
- 마크다운
- 스파르타내일배움캠프TIL
- string배열과 char
- 내주말
- 오블완
- 최종프로젝트
- 티스토리챌린지
- 분반별학습
- projectl
- 유니티
- 코딩테스트
- 스탠다드
- 스파르타부트캠프
- 프로그래머스
- 피셔예이츠
- 스파르타내배캠til
- 코테풀기
- 텍스트게임
- 분반별
- Input Field
- 알아볼것
- Action
- 코테
- 스파르타
- 내일배움캠프
- Today
- Total
Ottoman
내일배움캠프 7주 4일차(32) TIL - 트러블슈팅 본문
- 플랫폼 발사기 (난이도 : ★★★★★)
- 캐릭터가 플랫폼 위에 서 있을 때 특정 방향으로 힘을 가해 발사하는 시스템 구현특정 키를 누르거나 시간이 경과하면 ForceMode를 사용해 발사
플랫폼발사대를 통해 발사되면 플레이어는 이동입력을 해도 움직이지 못하고 정해진 방향을 향해 날라간다.
Collision collision은 바로 rigidbody를 읽기전용으로 가져올수 있는데
Collider other는 바로 rigidbody를 가져올 수 없다.
Collision은 그냥 클래스.
Collider는 Component를 상속하는 클래스다.
트러블슈팅
관측 : 플랫폼발사기에서 방향대로 조금 가다가 위로만감
이유 => y축vector는 direction.y = _rb.velocity.y; 이 코드를 통해 물리의 이동을 받는데 x,z축은 안받아서 그럼.
관측 : 플랫폼런처의 앞에 있으면 조금 날아가고 뒤에 있으면 많이 날아간다.
private void OnTriggerStay(Collider other)
{
if (Time.time - onPlatformTime > readyTime)
{
Debug.Log("Ready");
// 벡터 바꾸기
if (other.gameObject.TryGetComponent<PlayerController>(out PlayerController playercontroller))
{
playercontroller.ThrowPlayer();
}
Rigidbody rb = other.gameObject.GetComponent<Rigidbody>();
rb.AddForce(fixedDirection * shootPower, ForceMode.Impulse);
}
}
원인: 위 코드대로면 날라가는 도중에 겹쳐있는 시간사이에 코드가 몇번 더 실행된 거였다. 힘이 여러번 가해지니 날아가는 힘도 세진거다.
생각 : 날라가는 판정이 참이 되면 if문이 안돌게 한다.
private void OnTriggerStay(Collider other)
{
if (!IsShoot && Time.time - onPlatformTime > readyTime)
{
Debug.Log("Ready");
IsShoot = true;
StartCoroutine(FalseIsShoot());
// 벡터 바꾸기
if (other.gameObject.TryGetComponent<PlayerController>(out PlayerController playercontroller))
{
playercontroller.ThrowPlayer();
}
Rigidbody rb = other.gameObject.GetComponent<Rigidbody>();
rb.AddForce(fixedDirection * shootPower, ForceMode.Impulse);
Debug.Log("Shoot~~");
}
}
private IEnumerator FalseIsShoot()
{
yield return new WaitForSeconds(2f);
IsShoot = false;
yield return null;
}
bool값도 같이 체크해서 중복호출되지 않게 했다. bool값은 Invoke로 2초 뒤에 다시 false로 돌아오게 했다. 충분히 발사되고 남을 시간이다. 다시 코루틴으로 바꿨다.
이어서 발생한 문제
발사된 후 IsGrounded()가 참이면 벡터를 원래대로 되돌리게 했는데 발사가 된 다음 프레임에서 IsGrounded의 Ray가 땅에 닿아 참이 되어버려 오작동을 일으킨다.
생각 : IsGrounded가 참이 되지 않게 한다. => 발사한 잠시 시간에 IsGrounded의 Ray길이를 짧게 한다.
원인찾음 : IsGrounded의 layermask가 Default로 되어있었다. 그리고 발사원통도 Default여서 IsGrounded가 참이 나온것이었다......
오히려 잘 날아가던 상황이 있던게 제일 신기하다;;;;;
해결 : IsGrounded의 레이어를 변경, 지형의 레이어도 맞춤.
- 움직이는 플랫폼 구현 (난이도 : ★★★☆☆)
- 시간에 따라 정해진 구역을 움직이는 발판 구현
- 플레이어가 발판 위에서 이동할 때 자연스럽게 따라가도록 설정
// 발판은 일정한 간격으로 정해진 위치 두곳을 오간다.
// 마찰도 없고 끼울 자리도 없다.
플레이어가 플랫폼 위에 발붙이고 있다면 플랫폼의 그자리에서 플랫폼의 이동과 같은 벡터로 이동한다.
플랫폼의 벡터를 얻어서 플레이어에게 같은 벡터를 더한다.
참고링크:
C# Invoke와 BeginInvoke의 차이점 (목적 / 정의 / 사용 방법 / 예제) (tistory.com)
개인과제소감 :
과제관점에서는 시간분배에 실패했다. Raycast에 너무 시간을 쏟았다.
'TIL' 카테고리의 다른 글
내일배움캠프 7주 토요일 TIL- 코루틴매니저? 프로퍼티에 이벤트? (0) | 2024.06.01 |
---|---|
내일배움캠프 7주 5일차(33) TIL - 디버깅 ,직렬화 메모 (0) | 2024.05.31 |
내일배움캠프 7주 3일차(31) TIL (0) | 2024.05.29 |
분반별 3주차 Q3 (0) | 2024.05.29 |
분반별 3주차 Q2 (0) | 2024.05.29 |