크래프톤 정글 TIL : 1106

lazyArtisan·2024년 11월 6일
0

정글 TIL

목록 보기
129/147

📝 배운 것들


🏷️ this.enabled와 SetActive의 차이

this.enabled = false;
대상: 현재 스크립트 컴포넌트만 비활성화

gameObject.SetActive(false);
대상: 게임 오브젝트 전체와 그 오브젝트의 모든 컴포넌트 및 자식 오브젝트를 비활성화



👾 나만무


심장소리

밤에 괴물이 가까워지면 심장소리 빨라지면서 커짐

자기 자신한테 달려있는 스크립트면 그냥 getcomponent 때려버려도 됨?

된다고 함.

비활성화 해버리면 그 뒤의 적은 건 오류 없이 실행 안 되는거 맞지?

네, 스크립트를 비활성화하면 해당 스크립트의 Update, FixedUpdate, OnTrigger 등 라이프사이클 메서드가 더 이상 실행되지 않기 때문에, 이후 코드는 오류 없이 실행되지 않습니다.

// using System.Collections.Generic;
// using UnityEngine;
// using Photon.Pun;
// using System.Linq;
// public class Heartbeat : MonoBehaviour
// {
//     [SerializeField] private AudioSource heartbeatSound;

//     private GameObject Monster;


//     private void Update()
//     {
//         if (!NetworkManager.Instance || NetworkManager.Instance.IsMonster()) return;

//         if (Monster == null)
//         {
//             List<GameObject> Monsters = NetworkManager.Instance.Monsters.Values.Select(monster => monster.gameObject).ToList();
//             if (Monsters.Count > 0)
//             {
//                 Monster = Monsters[0];
//             }
//             else
//             {
//                 Debug.Log("몬스터가 없음");
//                 return;
//             }
//         }

//         if (!TimeManager.instance.isDay)
//             Debug.Log("낮임");

//         if (!SpectatorManager.instance.isSpectating)
//             Debug.Log("관전 중이 아님");

//         // 밤이고, 관전 중이 아닐 때, 몬스터와 가까워질수록 빠르고 크게 심장소리 재생
//         if (!TimeManager.instance.isDay && !SpectatorManager.instance.isSpectating)
//         {
//             float distance = Vector3.Distance(Monster.transform.position, transform.position);
//             if (distance < 10f)
//             {
//                 heartbeatSound.volume = 2f;
//                 heartbeatSound.pitch = 2f;
//             }
//             else if (distance < 20f)
//             {
//                 heartbeatSound.volume = 1f;
//                 heartbeatSound.pitch = 1f;
//             }
//             else
//             {
//                 heartbeatSound.volume = 0.5f;
//                 heartbeatSound.pitch = 0.5f;
//             }
//         }
//         else
//         {
//             heartbeatSound.volume = 0f;
//         }
//     }
// }

너무 오래 걸려서 일단 보류

문 가까이 가면 interact 안 뜨는 문제

어떤 물체에 가까이 가면 (바짝 붙는 것도 아니고 적당히 가까이 가면) 레이캐스트가 작동 안 하는거 같은데 왜 그런거임

Raycast가 물체에 적당히 가까이 가면 작동하지 않는 이유는 Raycast의 시작 위치가 물체의 콜라이더 내부에 들어가 버리기 때문일 가능성이 큽니다. Raycast는 기본적으로 시작 위치에서 바로 앞에 있는 오브젝트를 감지하지 못하고, 콜라이더 내부에서 시작된 경우에도 제대로 감지하지 못할 수 있습니다.

문 주제에 박스 콜라이더가 겁나 큼.
프리팹에서 콜라이더 줄여서 해결

한 줄 알았는데 아무리 조절해도 안되는게 있음.

디버그 찍어서 확인해보니까 맵 애셋에 원래 있던 disable 뭐시기라는 트리거 콜라이더가 문 앞에 있었음
오클루전 컬링으로 최적화를 하기 위한 수단이었는데 우리 게임에는 필요 없는거였다.
그거 지웠더니 완벽하게 해결

은 아니고 문 하나가 안되기는 했는데 그건 그냥 콜라이더 조절해서 해결

게임 끝나면 마우스 조작 못하도록

관전 모드일때도, 그냥 플레이할 때도 조작 꺼야 됨

getcomponent는 게임 오브젝트여도 트랜스폼이어도 상관없이 잘 작동한다는거네?

네, 맞습니다. GetComponent<>()는 GameObject이든 Transform이든 관계없이 같은 오브젝트에 붙어 있는 컴포넌트를 가져올 수 있습니다.

        // 끝났으면 마우스로 시점 조종 불가
        if (TimeManager.instance.isEnd)
        {
            this.enabled = false;
            return;
        }

그냥 플레이할 땐 이걸로

        // 끝났으면 관전 종료
        if (TimeManager.instance.isEnd)
        {
            transform.Find("FreeLock Camera").GetComponent<CinemachineInputProvider>().enabled = false;
            this.enabled = false;
            return;
        }

관전 모드일 땐 이걸로

아 근데 관전 모드일 땐 안됨
그냥 굳이 이동 안 끄기로



💻 c++ 공부


https://modoocode.com/136

📌 namespace

std::cout // std라는 namespace에 정의된 cout

어떤 정의된 객체에 대해 어디 소속인지 지정해주는 것.
자기 자신이 들어있는 namespace 안에선 굳이 명시해주시 않아도 된다.

using header1::foo;

앞으로 모든 foo()는 header1이라는 namespace에서만 호출됨

using namespace header1;

header1에 정의된 모든 것들을 header1:: 없이 사용하기

using namespace std;는 권장되지 않음. std에 이름이 겹치는 함수를 만들게 되면 오류가 발생하기 때문. c++ 표준 라이브러리에는 수많은 함수가 존재하고 있다.

namespace {
	int x = 20; // static int x = 10; 와 같은 효과
}

이름 없이 namespace 사용하면 해당 파일 안에서만 접근 가능함.
(static 키워드로 변수를 선언한 것과 같은 효과)

0개의 댓글