주의 : 개발하면서 들었던 생각과 잡담이 많으며 제가 개발한 것이 아주 비효율적일 수 있습니다. 댓글 환영
프로토 발표가 끝났다. 이제 곧 알파 발표가 있어서 기능적인 구현을 모두 마쳐야한다. 그래서 오늘은 캐릭터 창을 새롭게 만드려고한다.
작업 흐름은 아래와 같다.

1. 플레이어가 캐릭터를 선택하면, 캐릭터 정보를 로컬에 저장한다.
2. 캐릭터 선택 후 게임 진입 버튼을 누르면 ConnectionManager에서 캐릭터를 생성한다.
3. 그리고 생성된 캐릭터에 들어있는(?) PlayerManager에서 플레이어가 선택한 게임 캐릭터의 정보와 일치하는 캐릭터만 활성화 시키고 이전에 설정한 닉네임 값이 있으면 닉네임도 설정해준다.
1. 플레이어 캐릭터 선택 후 캐릭터 정보 로컬에 저장

해당 캐릭터를 클릭하면 콘솔에 캐릭터 게임오브젝트의 이름을 가져오도록 설정했다.
Onclick함수를 사용하려고 했지만, 매개변수를 받을 수 없다는 말에 Ray를 쐈다.
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
print(hit.collider.name);
}
}
}
마우스가 클릭한 게임오브젝트의 이름을 가져와서 저장한 뒤 다음 씬에서 로드되로록 할 것이다.
위의 행위를 하려면 두 가지를 생각할 수 있는데
1. 로컬에 저장한 뒤 다음 씬에서 가져오기
2. static 함수를 불러서 설정해주기
우리는 한번 플레이를 했다면 캐릭터를 계속 기억해줄거다. 그래서 1번 방법으로 시도하겠다.
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
string characterName = hit.collider.name; <--- new
PlayerPrefs.SetString("CharacterName", characterName); <--- new
}
}
}
유니티에서 로컬에 정보를 저장하는 방법은 PlayerPrefs를 사용하는 방법이다. int, string, flot 값을 "key" : value로 저장 가능하다.
2. 캐릭터 선택 후 게임 진입 버튼을 누르면 ConnectionManager에서 캐릭터를 생성한다.
이제 다음 씬에서 게임오브젝트의 이름을 판별하여 플레이어를 생성해야한다.
멀티플레이를 지원해야하므로 Photon의 instantiate와 PunRPC를 사용 할 것이다.
1. 게임이 시작되자마자 resources에서 Player를 데려온다.
2. 저장된 이름을 가진 게임 오브젝트만 활성화한다.
3. 생성한다.
public class ConnectionManager03 : MonoBehaviourPunCallbacks
{
// 인스턴스
public static ConnectionManager03 instance;
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(this.gameObject);
}
}
public void OnClickConnect()
{
//서버 접속 요청
PhotonNetwork.ConnectUsingSettings();
print(nameof(OnClickConnect));
}
***OnClickConnect() 이하는 photon에서 멀티 서버에 접속할 수 있는 코드가 작성되어있다.***
}
위처럼 작성 후 resources에 들어있는 player 프리팹의 PlayerManager.cs를 작성해준다.
3. 그리고 생성된 캐릭터에 들어있는(?) PlayerManager에서 플레이어가 선택한 게임 캐릭터의 정보와 일치하는 캐릭터만 활성화 시키고 이전에 설정한 닉네임 값이 있으면 닉네임도 설정해준다.
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class PlayerManager : MonoBehaviourPun
{
// 나의 카메라
public Camera camera;
// 프리팹의 닉네임
public TMP_Text nickName;
// 실제 Player를 담고있는 부모 gameobject
public GameObject playerList;
private void Start()
{
// 내 캐릭터가 아니면 카메라 끄기
if(!photonView.IsMine)
{
camera.enabled = false;
}
// 닉네임 설정
nickName.text = photonView.Owner.NickName; // connection manager의 join room에서 설정해줌
}
public void SelectModel(string characterName)
{
// rpc 함수로 캐릭터를 생성
photonView.RPC(nameof(RpcSelectModel), RpcTarget.AllBuffered, characterName);
}
[PunRPC]
void RpcSelectModel(string characterName)
{
// Player 프리팹 안에 들어있는 캐릭터 중
foreach(Transform t in playerList.transform)
{
if(t.name == characterName)
{
t.gameObject.SetActive(true);
}
}
}
}
위처럼 해주면, 플레이어가 선택한 캐릭터가 방에 입장하는 것을 볼 수 있다.
번외. UI 위에 게임오브젝트 입히기

씬을 분리하면서 기존 말랑콩떡 귀엽고 아기자기한 디자인이 삭제되었다. 그래서 번외로 해당 씬을 수정하고자한다.

오브젝트를 두고 canvas를 생성하여 이미지를 삽입하면 위처럼 UI가 캐릭터를 덮어버린다.
이럴땐 canvas모드를 변경해주면 된다.

screnn space - overlay로 하면 제일 마지막에 랜더링 되어 모든 오브젝트를 덮어버린다. 그래서 screen space - camera로 변경하고 render camera에 비추고 싶은(?) 카메라를 드래그앤 드롭하면

게임오브젝트가 UI보다 위에 위치할 수 있다.
'동식이 취업시키기 작전 > Unity' 카테고리의 다른 글
Unity에서 엑셀파일, csv파일 데이터 읽기(겁나 상세하게 적음) (1) | 2024.06.07 |
---|---|
[MMORPG 게임서버 만들기] 쓰레드, 쓰레드 풀(풀링) (0) | 2024.03.23 |
[Unity] 에셋 프리팹이 어둡게 나올 때(feat. Built-in, URP) (1) | 2023.12.21 |
[융합 프로젝트] AddListener로 필수정보 입력 후 버튼 활성화(feat. Text mesh pro) (0) | 2023.11.05 |
[Unity] Color에서 a(알파, 오퍼시티)값 변경하기 (0) | 2023.09.01 |
주의 : 개발하면서 들었던 생각과 잡담이 많으며 제가 개발한 것이 아주 비효율적일 수 있습니다. 댓글 환영
프로토 발표가 끝났다. 이제 곧 알파 발표가 있어서 기능적인 구현을 모두 마쳐야한다. 그래서 오늘은 캐릭터 창을 새롭게 만드려고한다.
작업 흐름은 아래와 같다.

1. 플레이어가 캐릭터를 선택하면, 캐릭터 정보를 로컬에 저장한다.
2. 캐릭터 선택 후 게임 진입 버튼을 누르면 ConnectionManager에서 캐릭터를 생성한다.
3. 그리고 생성된 캐릭터에 들어있는(?) PlayerManager에서 플레이어가 선택한 게임 캐릭터의 정보와 일치하는 캐릭터만 활성화 시키고 이전에 설정한 닉네임 값이 있으면 닉네임도 설정해준다.
1. 플레이어 캐릭터 선택 후 캐릭터 정보 로컬에 저장

해당 캐릭터를 클릭하면 콘솔에 캐릭터 게임오브젝트의 이름을 가져오도록 설정했다.
Onclick함수를 사용하려고 했지만, 매개변수를 받을 수 없다는 말에 Ray를 쐈다.
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
print(hit.collider.name);
}
}
}
마우스가 클릭한 게임오브젝트의 이름을 가져와서 저장한 뒤 다음 씬에서 로드되로록 할 것이다.
위의 행위를 하려면 두 가지를 생각할 수 있는데
1. 로컬에 저장한 뒤 다음 씬에서 가져오기
2. static 함수를 불러서 설정해주기
우리는 한번 플레이를 했다면 캐릭터를 계속 기억해줄거다. 그래서 1번 방법으로 시도하겠다.
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
string characterName = hit.collider.name; <--- new
PlayerPrefs.SetString("CharacterName", characterName); <--- new
}
}
}
유니티에서 로컬에 정보를 저장하는 방법은 PlayerPrefs를 사용하는 방법이다. int, string, flot 값을 "key" : value로 저장 가능하다.
2. 캐릭터 선택 후 게임 진입 버튼을 누르면 ConnectionManager에서 캐릭터를 생성한다.
이제 다음 씬에서 게임오브젝트의 이름을 판별하여 플레이어를 생성해야한다.
멀티플레이를 지원해야하므로 Photon의 instantiate와 PunRPC를 사용 할 것이다.
1. 게임이 시작되자마자 resources에서 Player를 데려온다.
2. 저장된 이름을 가진 게임 오브젝트만 활성화한다.
3. 생성한다.
public class ConnectionManager03 : MonoBehaviourPunCallbacks
{
// 인스턴스
public static ConnectionManager03 instance;
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(this.gameObject);
}
}
public void OnClickConnect()
{
//서버 접속 요청
PhotonNetwork.ConnectUsingSettings();
print(nameof(OnClickConnect));
}
***OnClickConnect() 이하는 photon에서 멀티 서버에 접속할 수 있는 코드가 작성되어있다.***
}
위처럼 작성 후 resources에 들어있는 player 프리팹의 PlayerManager.cs를 작성해준다.
3. 그리고 생성된 캐릭터에 들어있는(?) PlayerManager에서 플레이어가 선택한 게임 캐릭터의 정보와 일치하는 캐릭터만 활성화 시키고 이전에 설정한 닉네임 값이 있으면 닉네임도 설정해준다.
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class PlayerManager : MonoBehaviourPun
{
// 나의 카메라
public Camera camera;
// 프리팹의 닉네임
public TMP_Text nickName;
// 실제 Player를 담고있는 부모 gameobject
public GameObject playerList;
private void Start()
{
// 내 캐릭터가 아니면 카메라 끄기
if(!photonView.IsMine)
{
camera.enabled = false;
}
// 닉네임 설정
nickName.text = photonView.Owner.NickName; // connection manager의 join room에서 설정해줌
}
public void SelectModel(string characterName)
{
// rpc 함수로 캐릭터를 생성
photonView.RPC(nameof(RpcSelectModel), RpcTarget.AllBuffered, characterName);
}
[PunRPC]
void RpcSelectModel(string characterName)
{
// Player 프리팹 안에 들어있는 캐릭터 중
foreach(Transform t in playerList.transform)
{
if(t.name == characterName)
{
t.gameObject.SetActive(true);
}
}
}
}
위처럼 해주면, 플레이어가 선택한 캐릭터가 방에 입장하는 것을 볼 수 있다.
번외. UI 위에 게임오브젝트 입히기

씬을 분리하면서 기존 말랑콩떡 귀엽고 아기자기한 디자인이 삭제되었다. 그래서 번외로 해당 씬을 수정하고자한다.

오브젝트를 두고 canvas를 생성하여 이미지를 삽입하면 위처럼 UI가 캐릭터를 덮어버린다.
이럴땐 canvas모드를 변경해주면 된다.

screnn space - overlay로 하면 제일 마지막에 랜더링 되어 모든 오브젝트를 덮어버린다. 그래서 screen space - camera로 변경하고 render camera에 비추고 싶은(?) 카메라를 드래그앤 드롭하면

게임오브젝트가 UI보다 위에 위치할 수 있다.
'동식이 취업시키기 작전 > Unity' 카테고리의 다른 글
Unity에서 엑셀파일, csv파일 데이터 읽기(겁나 상세하게 적음) (1) | 2024.06.07 |
---|---|
[MMORPG 게임서버 만들기] 쓰레드, 쓰레드 풀(풀링) (0) | 2024.03.23 |
[Unity] 에셋 프리팹이 어둡게 나올 때(feat. Built-in, URP) (1) | 2023.12.21 |
[융합 프로젝트] AddListener로 필수정보 입력 후 버튼 활성화(feat. Text mesh pro) (0) | 2023.11.05 |
[Unity] Color에서 a(알파, 오퍼시티)값 변경하기 (0) | 2023.09.01 |