2017-02-03 3 views
2

나는이 문제에 대해 수 일간 머리를 긁어내어 도움을주었습니다.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); 
     } 
    } 
+0

이 섹션은 실제로이 ... 예를 목적으로해야한다는 (Input.GetButton ("Fire1")) { CmdFire (있는 경우 플레이어); } –

+0

아마도 _gun_?의 위치를 ​​동기화하고 있습니까? 플레이어가 사용하는 총의 끝에서 광선을 보내는 것이 더 쉬울 것입니다. 서버에는 선수 카메라를 나타내는 인스턴스가 없으므로 서버에서 '카메라'로 아무 것도하지 않으면 어디서든 얻을 수 있습니다. 카메라 뷰 벡터를 다른 방법으로 서버에 전달해야합니다. –

+0

지금은 플레이어의 회전과 위치를 동기화 중입니다. 총이 플레이어의 자식 객체이기 때문에 그 움직임을 볼 수 있습니다. 물론 위나 아래를 보면 잠시 동안 동기화되지 않습니다. 총의 끝에서 광선을 입사 할 때의 문제는 총이 완전히 똑 바른 것이 아니라면 주사가 화면 중앙에 오지 않을 것입니다. 총알이 가운데로 내려갈 수 있도록 카메라에서 캐스팅하고 있습니다. 전형적으로 총이 게임에서 개최되는 것처럼 보이려면 총알이 센터 화면보다 약간 각도가 오른쪽으로 기울어 져 샷이 느껴질 것입니다. –

답변

0

이런 식으로 생각해 :

나는 중요한 코드를 게시 할 예정입니다. 무기를 발사해야하는 것은 무엇입니까? 발사 지점과 발사 방향이 필요합니다 (간단한 경우). 그러니 그 정보 만 전달하십시오. CmdFire는 void CmdFire (Vector3 firingPoint, Vector3 firingDirection)처럼 보일 것입니다. 게임 객체를 플레이어 객체에 전달할 때 직렬화되어 서버로 보내 지므로 많은 불필요한 네트워크 트래픽이 발생합니다. 값 유형과 명령에 대한 간단한 객체에 충실하십시오.

이것이 결국 해결책이되었습니다. 조언 감사합니다. 레이캐스팅의 위치와 방향을 나타내는 두 개의 Vector3 매개 변수를 전달했습니다. 이제 클라이언트와 서버 모두에서 촬영할 수 있으며 두 가지 모두에서 총알 구멍을 볼 수 있습니다. 여기에 사람이 나중에 이것으로 실행 케이스에 고정 된 코드입니다

void Update() 
    { 
     if (isLocalPlayer) 
     { 
      if (Input.GetButton("Fire1")) 
      { 
       Vector3 FiringSpot = new Vector3(PlayerCam.transform.position.x, PlayerCam.transform.position.y, PlayerCam.transform.position.z); 
       Vector3 FireDirection = PlayerCam.transform.forward; 
       CmdFire(FiringSpot, FireDirection); 
      } 

    [Command] 
    void CmdFire(Vector3 firingPoint, Vector3 FiringDirection) 
    { 
     Ray shooterRay = new Ray(firingPoint, FiringDirection); 
     if (Physics.Raycast(shooterRay, out Hit, 10000)) 
     { 
      GameObject Bullet_Hole = (GameObject)Instantiate(bullet_Hole_Prefab, Hit.point, Quaternion.FromToRotation(Vector3.up, Hit.point)); 
      NetworkServer.Spawn(Bullet_Hole); 
      Destroy(Bullet_Hole, 10); 
     } 
    } 
+0

FYI는 이것을 사용하고자하는 사람들을 위해 .... 나는 방금 업데이트 된 메소드에 대해 닫는 대괄호가 없다는 것을 알아 차렸다. 그저 복사/붙여 넣기 오류 일뿐입니다. –