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 으로 설정

반응형
Posted by 이름이 익명
: