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번 문제 해결: 색깔을 바꾸는 값을 함수 안에다가 넣으니까 됐다. 아마도 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");
}