크래프톤 정글 TIL : 1105

lazyArtisan·2024년 11월 5일
0

정글 TIL

목록 보기
128/147

📝 배운 것들


🏷️ C# region

#region은 C#에서 코드 블록을 접거나 펼칠 수 있는 구역을 지정하는 데 사용됩니다. 이를 통해 코드의 가독성을 높이고, 특정 영역을 쉽게 관리할 수 있습니다.

  • #region: 특정 코드 영역의 시작을 표시합니다.
  • #endregion: #region으로 시작된 코드 블록의 끝을 표시합니다.
  • 이 사이에 포함된 코드 블록은 Visual Studio와 같은 IDE에서 접을 수 있는 기능이 제공됩니다.

🏷️ Fisher-Yates 알고리즘

배열이나 리스트의 요소들을 무작위로 섞는 알고리즘.
각 요소가 동일한 확률로 배치되도록 보장한다.

  1. 리스트 맨 끝에서부터 시작한다.
  2. 맨 끝 요소 앞에 있는 무작위 요소랑 맨 끝이랑 바꾼다.
  3. 바꾼 다음엔 인덱스를 하나 줄인다.

O(n^2)는 리스트 따로 만들어놓는데
위의 방법은 O(n)으로 된다.

🏷️ Quaternion.identity

Quaternion 구조체의 기본값으로, 회전이 없는 상태(0도 회전)를 나타내는 단위 쿼터니언

  • 오브젝트 생성 시 초기 회전 설정: Quaternion.identity를 사용해 오브젝트가 특정 각도로 회전하지 않은 상태에서 생성되도록 설정합니다.
  • 회전 초기화: 특정 이벤트나 상태에서 오브젝트의 회전을 기본 상태로 되돌릴 때 사용합니다


👾 나만무


아이디어 제안

플레이어가 플레이어나 NPC한테 잘못 공격하면 10초 간 기절?

밤이 되면 심장소리, 괴물이 다가오면 심장소리 커지게

밤 시작하면 모든 플레이어에게 괴물 변신 울음소리 들리게

맵에 떨어져 있는 각종 아이템

  • 근처에 괴물 있으면 삑삑거리는 탐지기
  • 손전등
  • 멀리 있는 사람들하고 통신할 수 있는 무전기 (무전기를 든 사람들끼리는 모두 같이 마이크 사용 가능)
    괴물은 이 아이템들 부숴버릴 수 있게?

킬, 인터렉션 버튼 없애고 가운데 글자 넣는 걸로 대체하는게 낫지 않을까?

괴물에서 사람으로 돌아오려면 사람을 반드시 하나 잡아먹어야 하면 어떨까

스폰 포인트 만들기

시작 컷신 다 걷어내고 카메라 쭉 빠지는 연출만 남기기로

GameObject.FindGameObjectsWithTag("SpawnPoint").Select(x => x.transform.position).ToArray();

여기서 => 이거 뭐임

코드에서 =>는 람다 표현식(Lambda Expression)을 나타내는 구문입니다.

역할

=>는 익명 함수를 정의하는 데 사용되며, Select 메서드와 같은 LINQ 구문에서 주로 활용됩니다. 이 구문은 각 요소를 특정 방식으로 변환하거나 필터링할 때 유용합니다.

  • Select(x => x.transform.position): Select 메서드와 =>를 사용하여, 각 GameObject의 transform.position을 선택하여 새로운 시퀀스를 만듭니다.
  • x => x.transform.position에서 x는 각 게임 오브젝트를 나타내며, x.transform.position을 반환하도록 정의한 것입니다.

public void LoadingEnd()
{
StartCoroutine(EndCoroutine());
}
IEnumerator EndCoroutine()
{
yield return new WaitForSeconds(1.5f);
loadingPanel.ModalWindowOut();
}

이거 코드 설명 좀

이 코드는 LoadingEnd 메서드가 호출되면 1.5초 후에 loadingPanel.ModalWindowOut() 메서드를 실행하는 구조로 되어 있습니다. LoadingEnd 메서드에서 코루틴을 시작하고, 코루틴 내에서 1.5초 대기 후 지정된 메서드를 실행합니다.

코드 설명

public void LoadingEnd()
{
    StartCoroutine(EndCoroutine());
}
  • LoadingEnd 메서드는 EndCoroutine 코루틴을 시작합니다.
  • StartCoroutine을 사용하여 코루틴을 실행합니다. 코루틴은 비동기적으로 실행되므로, 메서드 내에서 지정된 대기 시간을 기다릴 수 있습니다.
IEnumerator EndCoroutine()
{
    yield return new WaitForSeconds(1.5f);
    loadingPanel.ModalWindowOut();
}
  • EndCoroutine 코루틴은 1.5초 동안 대기한 후 loadingPanel.ModalWindowOut() 메서드를 호출합니다.
  • yield return new WaitForSeconds(1.5f);는 1.5초 동안 대기하도록 지시하는 구문입니다. 이 지점에서 1.5초가 지나면 다음 줄로 진행됩니다.
  • loadingPanel.ModalWindowOut()loadingPanel의 모달 창을 닫거나 숨기는 역할을 하는 메서드일 가능성이 있습니다.

요약

이 코드는 LoadingEnd 메서드가 호출된 후 1.5초 대기하고, 이후 loadingPanel.ModalWindowOut() 메서드를 실행하여 로딩 패널을 닫는 동작을 수행합니다.
-> ModalWindowOut은 애셋에 있던 코드였다.

using UnityEngine;
using UnityEngine.Playables;

public class TimelineEndTrigger : MonoBehaviour
{
    public PlayableDirector playableDirector;

    private void Start()
    {
        // 타임라인의 종료 이벤트에 함수 연결
        playableDirector.stopped += OnTimelineStopped;
    }

    private void OnTimelineStopped(PlayableDirector director)
    {
        // 타임라인이 끝나면 실행될 코드
        Debug.Log("타임라인이 종료되었습니다. 특정 코드를 실행합니다.");
        // 여기에 원하는 코드를 작성하세요.
    }

    private void OnDestroy()
    {
        // 메모리 누수를 방지하기 위해 이벤트 구독 해제
        playableDirector.stopped -= OnTimelineStopped;
    }
}

https://docs.unity3d.com/2023.2/Documentation/ScriptReference/Playables.PlayableDirector-stopped.html

gpt가 짜준 코드를 일단 붙여넣고 구글링으로 다른 레퍼런스 찾아봤는데
gpt도 애초에 유니티 매뉴얼에서 복붙해온거였다

    IEnumerator WaitForIntro()
    {
        yield return new WaitUntil(() => PD.state != PlayState.Playing);
    }

타임라인 끝나면 이어지도록 하기 위해 코루틴 써보려고 했는데
gpt가 성능 안 좋고 확장성 안 좋다고 쓰지 말라고 함

팀원한테도 물어봤더니
코루틴은 비동기 (동시에 같이 돌리는거) 를 위한 기능이기 때문에
이벤트로 하는게 맞을 것 같다고 함

현재는 각자 Actor number를 지정받고 그 인덱스를 기반으로 position 배열만 넘겨받아서 각자가 조종할 캐릭터를 instantiate 하는건데
모니터를 넘겨주려고 했더니 오브젝트는 각자가 달라서 식별이 안된다고 함. 하려면 photonview component를 달거나 unique한 게임 오브젝트 이름을 달면 된다고 함

NPC가 시작도 전에 화면에 나타날 수 있다고 하는 점을 말하고
로딩 코루틴과 연관돼있어서 어렵다고 말씀드리니 그냥 시작 컷신 빼자고 하심.

버튼 가운데로 옮기고 디자인

1. Interactable

  • 이 체크박스를 통해 버튼이 상호작용 가능한지 여부를 설정합니다.
  • 체크를 해제하면 버튼이 비활성화되어 클릭할 수 없으며, Disabled Color 색상이 적용됩니다.

2. Transition

  • 버튼의 전환 방식을 설정합니다. 버튼의 상태가 바뀔 때 색상이나 애니메이션 등 전환 효과를 지정할 수 있습니다.
  • Color Tint는 버튼이 눌리거나 선택될 때 색상이 변경되는 방식입니다. 그 외에도 Sprite Swap(이미지를 바꾸는 방식), Animation(애니메이션 전환)이 있습니다.

3. Target Graphic

  • 버튼의 그래픽 요소(예: Image 컴포넌트)를 지정하는 필드입니다.
  • 이 필드에 지정된 그래픽이 버튼의 시각적 전환 효과를 적용받습니다. 여기에서는 Button_kill이라는 이미지가 Target Graphic으로 설정되어 있습니다.

4. Normal Color

  • 버튼이 기본 상태일 때의 색상을 설정합니다.
  • 아무것도 선택되지 않았을 때 표시되는 색상입니다.

5. Highlighted Color

  • 버튼이 마우스를 올렸을 때(Hover)나 선택되었을 때의 색상을 설정합니다.
  • 버튼이 강조되는 상태로, 기본 색상보다 눈에 띄게 설정하는 것이 일반적입니다.

6. Pressed Color

  • 버튼이 클릭되었을 때 표시되는 색상입니다.
  • 눌리는 효과를 주기 위해 조금 더 어두운 색상으로 설정하는 경우가 많습니다.

7. Selected Color

  • 버튼이 선택된 상태일 때의 색상을 설정합니다. 이 상태는 특정 입력 장치에서 선택된 UI 요소를 나타낼 때 유용합니다.
  • 예를 들어, 게임 컨트롤러에서 버튼을 탐색할 때 현재 선택된 버튼에 이 색상이 적용됩니다.

8. Disabled Color

  • 버튼이 비활성화되었을 때 표시되는 색상입니다.
  • Interactable이 해제된 경우 이 색상이 적용되며, 일반적으로 회색 같은 흐릿한 색상으로 설정하여 비활성화 상태임을 나타냅니다.

9. Color Multiplier

  • 색상의 밝기나 강도를 조절하는 값입니다. 값이 높을수록 색상이 더 강렬해지고, 낮을수록 흐릿해집니다.
  • 기본값은 1이며, 필요에 따라 조정할 수 있습니다.

10. Fade Duration

  • 버튼 상태가 바뀔 때 색상이 전환되는 데 걸리는 시간을 설정합니다.
  • 값이 낮을수록 즉각적으로 전환되며, 값이 높을수록 부드럽게 전환됩니다.

색깔은 disabled color의 alpha 값 0으로 만들고

interactButtonText = interactButton.GetComponentInChildren<TextMeshProUGUI>();
killButtonText.text = "Kill";

텍스트는 대충 이런거 조건문 군데군데 박아서 해결

짜잔

0개의 댓글