크래프톤 정글 TIL : 1028

lazyArtisan·2024년 10월 28일
0

정글 TIL

목록 보기
120/147

📝 배운 것들


🏷️ 셰이더

렌더링 파이프라인을 일종의 인형극으로 보면 된다

머테리얼에 셰이더 지정할 수 있다

머테리얼은 물감이고
셰이더는 붓이다

머테리얼은 변수들을 담고 있고
셰이더는 그 변수들로 어떻게 계산하는지 정해져있다



👾 나만무


애셋 찾기

Asset NameLink
Sci-Fi Facility Sector 43Link
Sheriff 2Link
Monster Mutant 7Link
Male Medics ScientistsLink
The ScientistLink
Laboratory Scientists PackLink
Laboratory Interior and PropsLink
BaphometLink
Sci-Fi Engineer's RoomLink
Surgical Instruments Hospital PropsLink
Man in Protective SuitLink
Voices SFXLink
Protective Suit ManLink
Laboratory Complex SetLink
Laboratory Sci-FiLink
Laboratory 2 Sci-FiLink
Sci-Fi Dropship Modular SpaceshipLink
PA Space StationLink
Sci-Fi Heavy Station SetLink
NPC Formal Set 01Link
University Lecture TheatreLink
Control Benches PackLink
Worker 1Link
NPC Sailor CustomLink
Research ShipLink
Tropical IslandLink
Medieval ManLink
Character SailorLink
Atmospheric House ModularLink
Horror MansionLink
Abandoned Psychiatric HospitalLink
Prize Wheel MinigameLink
Up Down Simple Hyper Casual GameLink
Memory Match Game TemplateLink
Cups and Balls Game TemplateLink
Sliding Puzzle Game TemplateLink
Math Balancing Game TemplateLink
Bubble Shooter Game TemplateLink

이 표를 통해 각 Unity Asset의 이름과 링크를 확인할 수 있습니다.

관전 모드에 UI 추가

내가 짠 로직에 아직 그런 일이 발생 안 할 것 같은데? 라는 생각이 들더라도 예외 처리 해놓는게 좋다.

TextMeshPro 또는 TextMeshProUGUI 컴포넌트의 text 속성에 this.text로 바로 접근 가능한가?

  • 아니요, this.text로 바로 접근할 수 없습니다.
  • TextMeshPro 및 TextMeshProUGUI 컴포넌트는 Unity에서 제공하는 TextMeshPro 라이브러리의 별도 컴포넌트이므로, this.text로는 접근할 수 없습니다. TextMeshProUGUI 컴포넌트를 스크립트에 붙이고 text 속성에 접근하려면, 해당 컴포넌트를 먼저 가져와야 합니다.

예제 코드

using TMPro;
using UnityEngine;

public class Example : MonoBehaviour
{
    private TextMeshProUGUI tmpText;

    void Start()
    {
        // TextMeshProUGUI 컴포넌트를 가져와서 tmpText에 할당
        tmpText = GetComponent<TextMeshProUGUI>();
        tmpText.text = "Hello, World!"; // tmpText.text로 접근
    }
}

이렇게 TextMeshProUGUI 컴포넌트를 변수에 할당한 후 tmpText.text로 접근해야 합니다.

.text 속성에 한 번만 값을 설정하면, Update 문에서 계속 갱신하지 않아도 되는가?

  • 예, tmpText.text = "some text";처럼 텍스트를 한 번만 설정해두면, 이후 Update에서 별도로 갱신하지 않아도 텍스트 값이 유지됩니다.
  • Update에서 갱신해줄 필요가 있는 경우는 텍스트가 동적으로 변경되어야 할 때입니다. 예를 들어, 점수나 체력처럼 실시간으로 변화하는 값이 필요한 경우, Update에서 지속적으로 갱신해줘야 합니다.

따라서, 일회성으로 설정할 텍스트라면 Start나 특정 이벤트에서 한 번만 설정해도 됩니다.

tmpText.color = Color.green; 이거 왜 오류 남

tmpText.color = Color.green; 코드를 사용할 때 오류가 발생하는 이유는 TextMeshProUGUI에서 color 속성이 읽기 전용으로 설정되어 있을 가능성이 있습니다. 일부 버전에서는 tmpText.color 대신 tmpText.faceColortmpText.outlineColor 속성을 사용하여 텍스트 색상을 변경해야 합니다.

완성

    void Start()
    {
        remainingPlayers = new List<GameObject>(GameObject.FindGameObjectsWithTag("Player")); // 모든 플레이어를 찾아서 리스트에 추가
        Cursor.lockState = CursorLockMode.Locked; // 마우스 커서 숨김
        spectatingTarget = remainingPlayers[currentPlayerIndex]; // 초기 관전 대상 설정
        virtualCamera.Follow = this.transform; // 버츄얼 카메라가 Spectator를 따라다니도록 설정

        canvasInstance = Instantiate(canvasPrefab); // 캔버스 생성
        spectatorText = canvasInstance.GetComponentInChildren<SpectatorText>(); // 관전 대상 텍스트
        spectatorText.SetSpectatingTarget(spectatingTarget); // UI에 관전 대상 표시
        Debug.Log("Spectator Camera Start");
    }

Spectator에 붙어있는 SepctatorCamera에 있던 기존 Start에 캔버스 instantiate 시키는거 추가

    // 관전 대상 변경
    private void SwitchPlayer(int idx_change)
    {
        if (remainingPlayers.Count == 0)
            return;

        currentPlayerIndex += idx_change;
        if (currentPlayerIndex < 0)
            currentPlayerIndex = remainingPlayers.Count - 1;
        else if (currentPlayerIndex >= remainingPlayers.Count)
            currentPlayerIndex = 0;

        spectatingTarget = remainingPlayers[currentPlayerIndex];
        spectatorText.SetSpectatingTarget(spectatingTarget); // UI에 관전 대상 표시
        Debug.Log("Switching to player " + spectatingTarget.name);
    }

좌클 우클할 때 카메라 스크립트에서의 변수만 바꾸는게 아니라

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

public class SpectatorText : MonoBehaviour
{
    private GameObject spectatingTarget;
    private TMPro.TextMeshProUGUI tmpText;

    public void SetSpectatingTarget(GameObject target)
    {
        spectatingTarget = target;
        tmpText = GetComponentInChildren<TextMeshProUGUI>();

        switch (target.GetComponent<Player>().type)
        {
            case CharacterType.Scientist:
                tmpText.color = Color.green;
                tmpText.text = "Scientist\n" + spectatingTarget.name;
                Debug.Log("Change text to Scientist");
                break;
            case CharacterType.Monster:
                tmpText.color = Color.red;
                tmpText.text = "Monster\n" + spectatingTarget.name;
                Debug.Log("Change text to Monster");
                break;
            case CharacterType.NPC:
                Debug.Log("Change text to NPC");
                break;
        }

        tmpText = GetComponentInChildren<TextMeshProUGUI>();

        Debug.Log("Spectating Target Text Set : " + spectatingTarget.name);
    }
}

새로 생긴 canvas에 있는 UI text도 바꿔준다
(이거 처음 구현하고 타입 별 문구 다르게 하려다가 tmpText 할당을 삭제해버려서 왜 안되지 이러고 있었음)

미션 완료

다른 사람들 보이는 건
벽을 투시하게 보이면 좋을지 말지 모르겠
일단 해보고 별로면 그냥 마주쳤을 때 윤곽선만?

0개의 댓글