Unity/Portfolio Daily Log

캐주얼 슈팅 액션 대전 게임 (모바일) - 7 포톤_3 체력바, 닉네임 색깔로 적과 차별점 두기

Korokke 2022. 7. 22. 22:23

 

전 포스팅에서 만들었던 PlayerUI 스크립트

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

public class PlayerUI : MonoBehaviour
{
    private Color myColor;
    private Color enemyColor = Color.red;
    public TextMeshProUGUI playerName;
    public Slider playerHPBar;
    public Image hpBarFiller;

    private void Awake()
    {
        myColor = new Color(0, 226, 225);
    }
    public void SetSliderValue(float currentHP, int maxHP)
    {
        playerHPBar.value = currentHP / maxHP;
    }


    public void InitMyUI(string nickName, bool isMine)
    {
        SetNickName(nickName);
        SetNickNameColor(isMine);
        SetSliderColor(isMine);
    }
    public void SetNickName(string nickName)
    {
        playerName.text = nickName;
    }
    public void SetNickNameColor(bool isMine)
    {
        playerName.color = isMine ? new Color(0, 226, 225) : enemyColor;
    }
    public void SetSliderColor(bool isMine)
    {
        hpBarFiller.color = isMine ? new Color(0, 226, 225) : enemyColor;
    }

}

플레이어에 따라 닉네임, 닉네임 색깔, 슬라이더 색깔을 바꿀 수 있는 스크립트를 만들었다.

플레이어가 조종하는 캐릭터면 하늘색 아니면(적이면) 빨간색으로 바꾼다.

 

PlayerMediator 스크립트에서 불러줬다.

void Awake()
{
    if (PV.IsMine)
        {
            status.PlayerUI.InitMyUI(nickName: PhotonNetwork.NickName, isMine: true);
        }
        else if (!PV.IsMine) 
        {
            status.PlayerUI.InitMyUI(nickName: PV.Owner.NickName, isMine: false);
        }
}

문제발생:

  1. 첫번째 플레이어의 이름은 정상적으로 바뀌나 플레이어 이름과 슬라이더의 색깔이 이상하다.
  2. 두번째 들어온 유저의 닉네임이 공백으로 표시된다.

 

 

1번 문제 해결: 색깔을 바꾸는 값을 함수 안에다가 넣으니까 됐다. 아마도 PlayerMediator 의 Awake가 먼저 실행되고 PlayerUI의 Awake가 늦게 실행돼서 Color 값이 InitUI가 실행될 시점에 초기화 되지 않았던 게 아닐까?

public class PlayerUI : MonoBehaviour
{
    public void SetNickName(string nickName)
    {
        playerName.text = nickName;
        print($"NickName {nickName}");
    }
    public void SetNickNameColor(bool isMine)
    {
        playerName.color = isMine ? new Color(0, 226, 225) : Color.red;
        print($"nameColor {isMine}");
    }
    public void SetSliderColor(bool isMine)
    {
        hpBarFiller.color = isMine ? new Color(0, 226, 225) : Color.red;
        print($"SliderColor {isMine}");
    }

}

2번 문제 해결:

전에 만들었던 NetworkManager 스크립트에서 이름을 바꾸는 부분은 PhotonNetwork.NickName 부분이다.

public void JoinOrCreateRoom() => PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions { MaxPlayers = 2 }, null);

public override void OnJoinedRoom()
{
    PhotonNetwork.NickName = nickNameInput.text;
    if (PhotonNetwork.IsMasterClient)
    {
        SceneManager.LoadScene("PlayScene");
    }
}

 

PhotonNetwork.NickName 부분을 PhotonNetwork.LocalPlayer.NickName으로 할당하고, 방에 들어갔을 때 이것을 바꾸는게 아닌 방에 참가할 때 닉네임을 할당하면 된다.

public void JoinOrCreateRoom() 
{
    PhotonNetwork.LocalPlayer.NickName = nickNameInput.text;
    PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions { MaxPlayers = 2 }, null); 
}

public override void OnJoinedRoom()
{
        
    if (PhotonNetwork.IsMasterClient)
        SceneManager.LoadScene("PlayScene");
}