Unity/Project : Cursed Treasure
Unity 팀프 21.05.31. PUN2 - CustomProperties(R&D)
HappyFrog
2021. 6. 1. 00:13
아무리봐도 기능사용에는 문제가 없다. 현재 짐작가는 부분은
- PlayerControllerScirpt에서 Trigger처리를 하기 때문에 1~4번중 한 객체가 OnTriggerEnter된다면 나머지 객체에서도 OnTriggerEnter메서드가 실행된다는 가정.
- Player들이 각자의 CustomProperty를 가지고 있지 않아서 겹친다는 가정
- 아니면 OnPlayerPropertiesUpdate가 모든 플레이어를 불러온다는 가정
여기서 3번째 가정은 틀렸다. 이유는 만약 1~3번중 2번이 유물을 먹어 CustomProperty의 값이 바뀌었다면, 2번에 대한 정보가 전부 로그로 출력이 된 뒤에 3번,1번으로 바뀐값을 출력했다. 따라서 OnPropertiesUpdate는 바뀐 플레이어만 갱신해 주는 기능이 맞다.
1번째 가정도 틀렸다. Unity와 Build로 둘 다 실행하고 한 방에서 Unity의 PlayerController와 CapsuleCollider를 꺼보았지만, 출력은 여전히 유물을 먹은 2번의 프로퍼티가 갱신되고, 1번의 OnTriggerEnter가 실행되며 프로퍼티가 한번 더 갱신된다.
ㄴ혹시나해서 아예 컴포넌트를 제거해보았지만 결과는 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;
using Hashtable = ExitGames.Client.Photon.Hashtable;
public class InGame : MonoBehaviourPunCallbacks, IPunObservable
{
public List<Transform> spawnPoints;
public CameraController camController;
public Button btn;
//[HideInInspector]
//public Player playerCharacter;
bool isLocal;
bool s1 = true;
GameObject character;
Vector3 pos;
[HideInInspector]
public int idx;
Hashtable hash;
Dictionary<string, object> playerInfo;
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
stream.SendNext(this.character.transform.position);
pos = (Vector3)stream.ReceiveNext();
}
private void Awake()
{
PhotonNetwork.SendRate = 60;
PhotonNetwork.SerializationRate = 60;
}
void Start()
{
idx = 0;
//hash = new Hashtable();
Init();
}
void Update()
{
if (Input.GetKey(KeyCode.W))
{
this.character.transform.Translate(0, 0, 0.1f);
}
if (Input.GetKey(KeyCode.S))
{
this.character.transform.Translate(0, 0, -0.1f);
}
if (Input.GetKey(KeyCode.A))
{
this.character.transform.Translate(-0.1f, 0, 0);
}
if (Input.GetKey(KeyCode.D))
{
this.character.transform.Translate(0.1f, 0, 0);
}
}
void Init()
{
SpawnCharacter();
SpawnTreasure();
}
void SpawnTreasure()
{
if (PhotonNetwork.LocalPlayer.IsMasterClient)
PhotonNetwork.Instantiate("Treasure", Vector3.zero, Quaternion.identity);
}
void SpawnCharacter()
{
foreach (var player in PhotonNetwork.PlayerList)
{
if (player.IsLocal)
{
var spawnPosition = spawnPoints[idx].position;
this.character = PhotonNetwork.Instantiate("TestPlayer", spawnPosition, Quaternion.identity);
this.character.name = this.character.name + idx.ToString();
player.TagObject = this.character as GameObject;
this.character.GetComponent<PlayerController>().isLocal = true;
this.character.GetComponent<PlayerController>().Init();
camController.Init(idx.ToString(), spawnPosition);
}
idx++;
}
}
public override void OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps)
{
Debug.Log(PhotonNetwork.LocalPlayer.CustomProperties["IsRobber"]);
Debug.Log(targetPlayer.CustomProperties["IsRobber"]);
Debug.LogFormat("{0}, {1}", targetPlayer.NickName, changedProps["IsRobber"]);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class PlayerController : MonoBehaviourPun
{
public Transform camera;
public Rigidbody rigid;
[HideInInspector]
public bool isLocal;
[SerializeField]
float speed;
VariableJoystick joystick;
private void Start()
{
}
public void Init()
{
if (!isLocal) return;
speed = 3f;
this.gameObject.GetComponent<CapsuleCollider>();
var cameraGo = GameObject.Find("Main Camera");
camera = cameraGo.GetComponent<Transform>();
var joystickGo = GameObject.Find("Variable Joystick");
joystick = joystickGo.GetComponent<VariableJoystick>();
}
private void FixedUpdate()
{
if (!isLocal) return;
Vector3 joystickDir = Vector3.forward * joystick.Vertical + Vector3.right * joystick.Horizontal;
if (joystickDir == Vector3.zero) return;
Vector3 playerAngle = Quaternion.LookRotation(joystickDir).eulerAngles;
Vector3 camPivotAngle = camera.eulerAngles;
Vector3 towardAngle = Vector3.up * (playerAngle.y + camPivotAngle.y);
rigid.rotation = Quaternion.Euler(towardAngle);
rigid.transform.Translate(Vector3.forward * Time.deltaTime * speed);
}
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Treasure")
{
Debug.Log("Triggered");
Debug.Log(this.gameObject.name);
var treasure = other.GetComponent<PhotonView>();
PhotonNetwork.Destroy(treasure.gameObject);
PhotonNetwork.LocalPlayer.CustomProperties.Add("IsRobber", PhotonNetwork.LocalPlayer.ActorNumber);
PhotonNetwork.LocalPlayer.SetCustomProperties(PhotonNetwork.LocalPlayer.CustomProperties);
Debug.Log(PhotonNetwork.NickName);
}
}
}
2번을 검증해보려고 했지만 계속 오류가 나서 일단 오늘은 여기서 접는다.