나는이 문제에 대해 수 일간 머리를 긁어내어 도움을주었습니다.Unity Multiplayer FPS 클라이언트/서버 상호 작용 문제
목표 : 나는 선수가 총을 발사 할 수있는 학습 목적으로 간단한 FPS가 있습니다. 고객이 총알 구멍을보고 싶습니다. 클라이언트가 총을 발사하려고 할 때 서버 측 메서드를 호출하여이 작업을 수행하려고합니다. 서버 측 메서드는 플레이어 카메라에서 레이 캐스트하고 모든 사람들이 볼 수있는 총알 구멍을 생성해야합니다.
문제 : 플레이어를 서버 메서드에 매개 변수로 전달하여 부분적으로 작동하도록 할 수 있습니다. 그러나 플레이어 카메라를 기반으로 레이 캐스팅을 수행해야하므로 총알 구멍이 문자 높이로 끝납니다 (카메라가 아닌 플레이어를 사용하기 때문에)
카메라를 통과하지 못하게합니다. 을 통하여. bullet이라는 빈 게임 객체를 만들어서 전달하려고 시도했지만 "객체 참조가 객체의 인스턴스로 설정되지 않았습니다." 이 같은 오류는 서버 측 메서드에 전달하려고하는 플레이어의 자식 요소가 표면에 나타납니다.
이 작업을 수행하는 데 올바른 방법이 확실하지 않습니다. 제 코드에 위조 된 서식을 사용하여 미안합니다. 나는 여기에 붙여 넣는 데 어려움을 겪고 있었고, 나는 사전에 사과하기 위해 미리보기를하고있었습니다.
void Update()
{
if (isLocalPlayer)
{
if (Input.GetButton("Fire1"))
{
CmdFire(BulletSpawn);
}
}
[Command]
void CmdFire(GameObject Player)
{
Ray shooterRay = new Ray(Player.transform.position, Player.transform.forward);
if (Physics.Raycast(shooterRay, out Hit, 10000))
{
Debug.Log("player hit");
GameObject Bullet_Hole = (GameObject)Instantiate(BulletHole_Prefab, Hit.point, Quaternion.FromToRotation(Vector3.up, Hit.point));
NetworkServer.Spawn(Bullet_Hole);
}
}
이 섹션은 실제로이 ... 예를 목적으로해야한다는 (Input.GetButton ("Fire1")) { CmdFire (있는 경우 플레이어); } –
아마도 _gun_?의 위치를 동기화하고 있습니까? 플레이어가 사용하는 총의 끝에서 광선을 보내는 것이 더 쉬울 것입니다. 서버에는 선수 카메라를 나타내는 인스턴스가 없으므로 서버에서 '카메라'로 아무 것도하지 않으면 어디서든 얻을 수 있습니다. 카메라 뷰 벡터를 다른 방법으로 서버에 전달해야합니다. –
지금은 플레이어의 회전과 위치를 동기화 중입니다. 총이 플레이어의 자식 객체이기 때문에 그 움직임을 볼 수 있습니다. 물론 위나 아래를 보면 잠시 동안 동기화되지 않습니다. 총의 끝에서 광선을 입사 할 때의 문제는 총이 완전히 똑 바른 것이 아니라면 주사가 화면 중앙에 오지 않을 것입니다. 총알이 가운데로 내려갈 수 있도록 카메라에서 캐스팅하고 있습니다. 전형적으로 총이 게임에서 개최되는 것처럼 보이려면 총알이 센터 화면보다 약간 각도가 오른쪽으로 기울어 져 샷이 느껴질 것입니다. –