유니티 공부.. 물리 버그 잡기 , 골드메탈님
unity 유니티 공부 2024. 12. 10. 17:15 |https://www.youtube.com/watch?v=dynN70kyD9A
플레이어가 다른 물체 콜라이더와 충돌 후
한 방향으로 계속 회전되는 문제
플레이어 스크립트 열어서 해결해야 함
void FreezeRotation()
{
rigid.angularVelocity = Vector3.zero;
}
void FixedUpdate()
{
FreezeRotation();
}
넣으면 됨
+
충돌 레이어 설정
인스펙터 창 오 위에 레이어 라는 게 있음
'탄피의 물리충돌은 플레이어의 물리충돌과 서로 영향을 안주게 한다'
레이어로 이런걸 설정 가능함
이번 강좌에선 위 Floor, Player, PlayerBullet, BulletCase 네 개의 레이어를 새로 생성함
레이어 설정시
메시지 뜨면 예스 칠드런도 오키 칸을 누름
edit - project settings - physics - settings - layer collision matrix
각 레이어간 물리충돌 하냐 를 나타낸 것
'탄피는 바닥 하고 충돌하겠다'
'탄피는 탄피 끼리 충돌하겠다'
를 나타낸 게 위 스샷
플레이어 총알이 플레이어랑 충돌 안하게 하려고
playerbullet 과 player 사이는 체크 해제
layer collision matrix 가 프렌들리 파이어 하고 연관있는 거임
+
플레이어가 벽 관통되는 거 방지하기
플레이어 스크립트 만져야 함
bool isBorder;
void StopToWall()
{
Debug.DrawRay(transform.position, transform.forward*5,
Color.green);
isBorder = Physics.Raycast(transform.position,
transform.forward, 1, LayerMask.GetMask("Wall"));
}
void FixedUpdate()
{
StopToWall();
}
void Move()
{
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
// Walk 걸을 때 속도 감소
if (isDodge)
moveVec = dodgeVec;
if (isSwap || isReload || !isFireReady)
moveVec = Vector3.zero;
if (!isBorder)
transform.position += moveVec
* speed * (wDown ? 0.2f : 1.0f) * Time.deltaTime;
anim.SetBool("isRun", moveVec != Vector3.zero);
anim.SetBool("isWalk", wDown);
}
중간 삽입해야해서 좀 복잡함. 이건 영상을 봐야 함.
Wall 이라는 레이어 도 만들어야 함
캐릭터 앞 1 만큼의 빛을 쏴서 벽 콜라이더에 부딪치면
플레이어가 이동을 멈추겠다는 뜻임
+
아이템 충돌 제거
아이템에 다가가면 아이템이 회전해버리는 콜라이더가 의도치 않게 재생됨
Item 스크립트 열기
스크립트에서 쓰여진 건
우선순위 위에 있는 콤포넌트 부터 적용됨
그래서 이스 트리거 없는 콜라이더를 위로 올릴 필요가 있음
프리팹 모드로 들어간 후 moveup 눌러 컴포넌트 순서 재정렬
참고로 모든 아이템엔 프리팹에 스피어 콜라이더가 있음
Item 스크립트는 아래와 같음
using UnityEngine;
public class Item : MonoBehaviour
{
public enum Type
{ Ammo, Coin, Grenade, Heart, Weapon };
public Type type;
public int value;
Rigidbody rigid;
SphereCollider sphereCollider;
void Awake()
{
rigid = GetComponent<Rigidbody>();
sphereCollider = GetComponent<SphereCollider>();
}
void Update()
{
transform.Rotate(Vector3.up * 20 * Time.deltaTime);
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Floor")
{
rigid.isKinematic = true;
sphereCollider.enabled = false;
}
}
}
+
콜라이더 충돌 발생할때마다 너무 미끄러지는게 싫으면
피직스 마테리알을 none 으로 설정