크래프톤 정글 TIL : 1021

lazyArtisan·2024년 10월 21일
0

정글 TIL

목록 보기
113/147

👾 나만무


리눅스에서 URP 프로젝트 열었는데 빨간 화면
: edit - project settings - graphics apis for linux 체크 해제, graphics apis for linux에서 vulkan을 openglcore 위로 올림

애셋 import 했는데 분홍색
: 애셋 리드미 읽기, 에딧 - 렌더링 - material을 urp로 바꾸는 기능 있음.

오클루전 컬링으로 특정 대상 강조?

맵 만들고 부모 오브젝트 하나 만들고 프리팹화 시키면 다른 곳에서 가져다 쓸 수 있다.
왜 프리팹화? : 맵 씬을 그대로 가져다 쓰는게 불가능하기 때문. 그래서 프리팹화 한 다음 맵을 끌어다 가져온다.

빌드명 뒤에 버전 명과 멀 업데이트 했는지 쓴다

디버깅을 위해 전체화면 풀기 있는듯
기본은 alt enter로 전체화면 가능?

오브젝트 이름이 같은데 달려있는 컴포넌트가 달라서 일괄 변경이 불가능할 때 스크립트로 인스펙터 버튼이나 메뉴 버튼을 만들 수 있다.

문제 - 카트, 쓰레기통 움직이는거 해결해보셈
: 리지드 바디 constraints에서 freeze position 하면? 동적으로는 움직일 수 있는 연산을 하는데 거기에 못 움직이게 하는 연산을 추가하니까 안됨. 리지드바디 떼면? 좋은 해결책이지만 그거 말고도 있음. 상호작용은 하게 하는데 움직임은 고정하게 하고 싶으면 어떻게 할까?

여기서 이거 말고 다른게 뭐가 있을까

Collider 크기 및 모양 조정: 물체의 Collider 크기나 모양을 조정하여, 물리 엔진에서 예상하지 못한 충돌이 발생하지 않도록 할 수 있습니다. 예를 들어, 바닥과의 충돌을 방지하기 위해 상단에만 충돌 영역을 설정할 수도 있습니다.

Kinematic Rigidbody 사용: Rigidbody를 Kinematic 모드로 전환하면 물리 엔진에 의해 영향을 받지 않으면서도 스크립트를 통해 동적인 움직임 제어가 가능합니다. 즉, 물리 법칙에 의한 힘이나 중력에는 반응하지 않지만, 코드로 위치와 회전을 제어할 수 있습니다.

MovePosition 사용: Rigidbody.MovePosition 메서드를 사용하면, 리지드바디의 움직임을 코드로 직접 설정할 수 있습니다. 이 방식은 물리 엔진과 충돌하지 않으면서도 객체의 이동을 부드럽게 제어할 수 있습니다. 움직임에 대한 물리적인 연산은 유지되지만, 강제적으로 위치를 지정할 수 있습니다.

Physics Material: Collider에 적용되는 Physics Material을 사용해 마찰을 낮추거나 0으로 설정하면, 물체가 특정 충돌 면에서 멈추지 않고 스무스하게 미끄러질 수 있습니다. 이를 통해 물리 엔진에 의해 멈추는 것을 방지할 수 있습니다.

AddForce 대신 직접 위치 조정: AddForce를 사용하는 대신 직접 위치를 조정하면, 물리 엔진에 의해 적용되는 힘을 제한하면서도 이동을 제어할 수 있습니다.

is kinematic 옵션에 대해 설명해줘

물리 연산 비활성화:

Kinematic으로 설정된 오브젝트는 물리 엔진에 의해 계산되는 힘(중력, 충돌 등)에 영향을 받지 않습니다.
물리적인 상호작용(예: 충돌에 의한 반작용, 중력 등)으로 인한 움직임이 없으며, 오브젝트가 스스로 움직이려면 스크립트를 통해 수동으로 위치나 회전을 조정해야 합니다

Kinematic 객체는 다른 Rigidbody와 충돌할 수 있지만, 그 자체는 물리적인 반작용을 받지 않습니다. 즉, 다른 물체가 Kinematic 오브젝트와 충돌하면, 충돌한 물체는 반응하지만, Kinematic 오브젝트는 움직이지 않습니다.

rigidbody에 달려있는 파라미터들 전부 다 설명해줘

  1. Mass (질량)
    오브젝트의 질량을 나타냅니다.
    더 높은 질량은 충돌 시 더 큰 힘을 요구하며, 중력의 영향을 받는 정도도 증가합니다.
    기본값은 1이며, 단위는 킬로그램(kg)입니다.
  2. Drag (저항)
    오브젝트가 공기나 유체 중에서 이동할 때 받는 저항을 나타냅니다.
    값이 클수록 물체가 느리게 움직이며, 0이면 저항이 없는 상태가 됩니다.
    기본값은 0이며, 단위는 비율로, 1일 때는 저항이 강한 편입니다.
  3. Angular Drag (각저항)
    오브젝트가 회전할 때 받는 저항을 나타냅니다.
    이 값이 클수록 오브젝트는 회전 속도가 더 빠르게 줄어듭니다.
    기본값은 0.05이며, 값이 0이면 회전 저항이 없습니다.
  4. Use Gravity (중력 사용)
    체크하면 오브젝트가 중력의 영향을 받습니다.
    기본값은 체크되어 있으며, 체크 해제 시 오브젝트는 중력에 영향을 받지 않고 떠 있습니다.
  5. Is Kinematic
    체크하면 오브젝트는 물리 엔진에 의해 자동으로 움직이지 않고, 스크립트를 통해 수동으로 움직임을 제어할 수 있습니다.
    중력, 충돌 등의 물리적인 영향에서 제외됩니다.
    이 파라미터는 스크립트 제어가 필요한 물체나 움직임을 위해 사용됩니다.
  6. Interpolate (보간)
    물체의 움직임을 보간하여 더 부드러운 시각적 효과를 제공합니다.
    세 가지 옵션이 있습니다:
    None: 보간을 하지 않음. 기본값.
    Interpolate: 이전 프레임의 위치와 현재 위치를 보간하여 부드럽게 움직입니다.
    Extrapolate: 현재 위치에서 다음 프레임의 예상 위치를 보간하여 움직임을 예측합니다.
  7. Collision Detection (충돌 감지)
    충돌을 처리하는 방식을 결정합니다.
    충돌 감지가 부족할 경우 빠르게 움직이는 물체는 다른 물체를 관통할 수 있습니다.
    네 가지 옵션이 있습니다:
    Discrete: 프레임 간 충돌을 감지합니다. 일반적인 경우 사용.
    Continuous: 빠르게 움직이는 물체와의 충돌을 감지할 때 사용. 유체같이 빠르게 움직이는 물체가 관통하지 않도록 합니다.
    Continuous Dynamic: 다른 Continuous 오브젝트와의 충돌을 좀 더 정밀하게 계산합니다.
    Continuous Speculative: 예측된 위치에 따라 충돌을 감지합니다.
  8. Constraints (제약 조건)
    특정 축에 대해 오브젝트의 위치나 회전을 고정할 수 있습니다.
    Freeze Position: 오브젝트가 특정 축으로 이동하지 못하도록 고정합니다.
    Freeze Rotation: 오브젝트가 특정 축으로 회전하지 못하도록 고정합니다.
    여러 축을 동시에 선택해 물체의 움직임이나 회전을 제한할 수 있습니다. 예를 들어, 2D 게임에서는 Z축 회전을 고정할 수 있습니다.

layer overrides는 뭐임

  1. Layer Override Priority
    : 자신의 콜라이더와 겹치는 충돌이 발생할 때 어떤 것을 우선할지를 정해주는 우선순위이다.
    : 숫자가 낮을수록 우선순위가 높다.

  2. Include Layers
    : 충돌행렬에서 충돌이 안되게 설정한 것들을 이 물체에만 충돌체크가 되도록 해준다.

  3. Exclude Layers
    : 설정한 레이어로 된 콜라이더와의 접촉은 무시한다.

Layer Overrides는 Unity에서 특정 레이어 설정을 재정의하거나 추가적인 제어를 할 수 있도록 하는 기능입니다. 이 기능은 주로 Lighting, Shadows, Physics, Rendering 등과 같은 시스템에서 레이어별로 다른 동작을 하도록 설정할 때 유용합니다.

Unity의 레이어(Layer) 개념
Unity에서 Layer(레이어)는 게임 오브젝트들을 그룹화하는 방법 중 하나입니다. 레이어는 다양한 시스템에서 필터링의 역할을 합니다. 예를 들어:

물리 시스템(Physics): 특정 레이어에 있는 오브젝트들끼리만 충돌하도록 설정할 수 있습니다.
렌더링(Rendering): 카메라가 특정 레이어에 있는 오브젝트만 렌더링할 수 있습니다.
조명(Lighting): 특정 레이어에 있는 오브젝트들에만 조명을 적용할 수 있습니다.

  1. Collider 꺼보기 : 카트가 무저갱으로 떨어져버렸다
  2. Is Kinematic : 이거 체크해도 안 움직임. 중력과 충돌에 반응하지 않도록 한다고 함. 물리를 꺼버리는 거니까 정답 x. 물리 연산 안 하게 하는거라 이것도 좋은 해결책이라고는 함.
  3. Drag : 1000000으로 설정하니까 움직이지 않음. ad-hoc
  4. Layer Overrides : 플레이어에게 character layer를 달고
    cart1의 rigidbody layer overrides에서
    exclude layers에 character를 추가하면
    플레이어하고는 상호작용 안 하는데
    플레이어가 민 cart2하고는 상호작용 한다.

collider는 충돌 영역을 설정하고, rigidbody는 물리 적용을 관할

4번이 정답이었다.

character controller의 파라미터 전부 설명해줘

Unity의 Character Controller는 물리적인 움직임이 아닌, 직접적인 제어를 통해 캐릭터의 움직임을 처리할 수 있는 컴포넌트입니다. 주로 1인칭 또는 3인칭 캐릭터의 움직임을 구현할 때 사용됩니다. Character Controller는 Rigidbody와 다르게 물리 엔진의 힘이 아닌 스크립트로 직접 움직임을 제어하며, 충돌 감지를 지원하지만 중력이나 물리 연산을 적용하지 않습니다.

다음은 Character Controller 컴포넌트에 있는 주요 파라미터들의 설명입니다.

  1. Slope Limit
    캐릭터가 올라갈 수 있는 경사의 최대 각도입니다.
    경사도가 이 값보다 클 경우 캐릭터는 그 경사를 올라가지 못하고 미끄러집니다.
    기본값은 45도이며, 값은 각도로 설정됩니다.
    예시: Slope Limit을 45로 설정하면, 캐릭터는 45도 이하의 경사면을 오를 수 있지만, 45도 이상이면 미끄러집니다.
  2. Step Offset
    캐릭터가 올라갈 수 있는 계단이나 장애물의 최대 높이를 정의합니다.
    값이 높을수록 더 큰 장애물을 캐릭터가 자연스럽게 넘을 수 있습니다.
    기본값은 0.3입니다.
    예시: Step Offset이 0.3으로 설정되어 있으면, 0.3 단위 이하의 높이에서 캐릭터가 자동으로 계단을 오를 수 있습니다.
  3. Skin Width
    캐릭터와 다른 물체 사이의 최소 거리입니다.
    캐릭터가 충돌하는 물체로부터 아주 약간 떨어져 있도록 설정됩니다.
    값이 너무 작으면 캐릭터가 충돌 처리에서 문제가 생길 수 있고, 너무 크면 실제 물리적 충돌보다 큰 간격을 유지하게 됩니다.
    기본값은 0.08입니다.
    이 값은 충돌 감지를 안정적으로 처리하는 데 중요한 역할을 합니다. 값이 적절하지 않으면 캐릭터가 물체에 박히거나 끼는 현상이 발생할 수 있습니다.
  4. Min Move Distance
    캐릭터가 움직일 때, 최소로 움직일 수 있는 거리입니다.
    이 값보다 작은 움직임은 무시됩니다.
    기본값은 0.001입니다.
    이 파라미터는 작은 값으로 설정하는 것이 일반적입니다. 너무 큰 값으로 설정하면 작은 움직임이 무시되어 부드러운 이동이 어려울 수 있습니다.
  5. Center
    캐릭터의 중앙을 정의하는 값입니다. Vector3 값으로, 캐릭터의 Collider 중심 위치를 설정할 수 있습니다.
    기본적으로 (0, 1, 0)으로 설정되어 있으며, X, Y, Z 축을 기준으로 캐릭터의 중앙을 조정할 수 있습니다.
    예시: Y값을 높이면 캐릭터의 충돌 영역이 위로 이동하여, 캐릭터의 Collider 위치를 상향 조정할 수 있습니다.
  6. Radius
    캐릭터의 가로 크기(폭)를 정의합니다.
    기본값은 0.5이며, 캐릭터의 캡슐 모양의 Collider의 반지름을 결정합니다.
    이 값이 크면 캐릭터가 더 넓은 영역을 차지하게 되며, 충돌 감지 영역도 넓어집니다.
  7. Height
    캐릭터의 세로 크기(높이)를 정의합니다.
    기본값은 2이며, 캐릭터의 Collider 높이를 설정합니다.
    값이 커질수록 캐릭터의 충돌 영역이 세로로 더 넓어지며, 캐릭터가 더 높은 장애물과 상호작용하게 됩니다.
  8. Detect Collisions
    이 옵션을 체크하면 캐릭터가 충돌을 감지합니다.
    기본값은 체크된 상태이며, 체크 해제 시 캐릭터는 다른 물체와 충돌을 감지하지 않습니다.
    충돌을 비활성화하면 캐릭터가 물리적인 충돌 없이 물체를 통과할 수 있습니다.
  9. Enable Overlap Recovery
    캐릭터가 다른 오브젝트와 충돌했을 때, 충돌로 인해 오브젝트와 겹치는 경우 자동으로 겹침을 해결합니다.
    기본적으로 체크되어 있으며, 캐릭터가 다른 오브젝트와 겹쳐질 경우 강제로 충돌을 해소하려고 시도합니다.
    이 옵션은 캐릭터가 충돌 시 겹쳐서 끼지 않도록 도움을 줍니다.

Is Kinematic 일괄 설정

자식 오브젝트들의 Is Kinematic을 체크해야 하는데 그 수가 너무 많았음. 일괄 등록하려 해도 중간에 이름이 같고 컴포넌트 안 붙어있는 오브젝트들이 껴있어서 불가능.

팀장님께 여쭤봤더니 Editor 코드를 사용하면 된다고 하셨음.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SetKinematic : MonoBehaviour
{
    public void SetKinematicTrue()
    {
        Rigidbody[] rigidbodies = GetComponentsInChildren<Rigidbody>();
        foreach (Rigidbody rb in rigidbodies)
        {
            rb.isKinematic = true;
        }
    }
}

모든 오브젝트의 부모 오브젝트인 MapScene 오브젝트에 붙일 코드.

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(SetKinematic))]
public class ObjectMagic : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        SetKinematic setter = (SetKinematic)target;
        if (GUILayout.Button("Make as Kinematic"))
        {
            setter.SetKinematicTrue();
        }
    }
}

inspector gui 구현하는 함수.
Editor 폴더에 넣어두면 알아서 된다고 함.

이렇게 나온다.

Editor 상속받아서 base.OnInspectorGUI(); 이런거 가능한거. Editor.cs 가보면 target이 이렇게 정의돼있음.

    public UnityEngine.Object target
    {
        get
        {
            return m_Targets[referenceTargetIndex];
        }
        set
        {
            throw new InvalidOperationException("You can't set the target on an editor.");
        }
    }

프로퍼티란 무엇인가? 명강의 해주심

단순히 get set 가진게 프로퍼티라고 해버리면 안됨. 데이터 접근과 수정을 캡슐화할 수 있는 거라고 하셨었나?

내가 필요로 하는 건데 다른 놈이 맘대로 수정해버리면 안되게 막을 수 있는.

모르면 마이크로소프트 learn 봐라. 제일 잘 정리돼있다. Auto-implemented properties, Access control ...

0개의 댓글