Страница 1 из 1

Решение передачи поворота предмета от клиента мастеру

СообщениеДобавлено: 11 окт 2017, 16:17
юnity
Что то никак не передаётся. Вобщем я уже в названии темы почти объяснил суть проблеммы. Подбираю с пола сценщбджект(ружьё), на игроке 1 скрипт в апдейте:
Синтаксис:
Используется csharp
if(PhotonNetwork.isMasterClient){
 if (rpg != null){
        if (rpg.GetComponent<PhotonView> ().owner == PhotonNetwork.player) {
                Vector3 vectorRotate = RaycastRotate (new Vector2(_x, _y));
                RotateRPG(vectorRotate);
        }
 }
}

дальше функция:
Синтаксис:
Используется csharp
void RotateRPG(Vector3 vector){
                rpg.OnRotationTransform (vector.x, vector.y, vector.z);
        }


Как вы понимаете функция вызывает метод в самом классе rpg
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Rpg : Photon.MonoBehaviour {
        public void OnRotationTransform(float x, float y, float z){
        this.photonView.RPC("RotationAngel", PhotonTargets.MasterClient, x, y, z);
        }
        [PunRPC]
        void RotationAngel (float x, float y, float z, PhotonMessageInfo info) {
                this.photonView.RPC ("RotationAngelAll", PhotonTargets.All, x, y, z);
        }
        [PunRPC]
        void RotationAngelAll (float x, float y, float z) {
                //              Debug.Log (x+", "+ y+", "+z);
                transform.LookAt(new Vector3(x, y, z));
        }
}

на самом предмете висит скрипт PhotonView в обсерве этот скрипт и PhotonTransformView, галочки стоят на SinchronizePosition и SinchronizeRotation.
Пока оружие у клиента почемуто поворот не работает, только как мастер клиент берёт и дебаги сразу становитс видно в клиенте и видно так. Почему?
З.Ы Забыл сказать что ружьё поворачиваетс когда поворачиваетс персонаж, ну тоесть смотрит в ту сторону куда персонаж, может какой то конфликт со скриптом PhotonTransformView? Тогда может лучше отключить SinchronizeRotation?

Re: Решение передачи поворота предмета от клиента мастеру

СообщениеДобавлено: 12 окт 2017, 12:41
юnity
Вобщем переделал в плеере маленько
Синтаксис:
Используется csharp
void Update(){
if (photonView.isMine) {
if (rpg != null){
if (rpg.GetComponent<PhotonView> ().owner != null){
                                        Vector3 vectorRotate = RaycastRotate (new Vector2(_x, _y));
                                        RotateRPG(vectorRotate);
                                }
}
}
}
using UnityEngine;
using System.Collections;

public class Rpg : Photon.MonoBehaviour {
        bool isTaken = false;
        float _x = 0, _y = 0, _z = 0;
        void FixedUpdate(){
                if(isTaken)
                transform.LookAt (new Vector3(_x, _y, _z));
        }
        public void TakeRpg (){
                if( this.photonView.ownerId == PhotonNetwork.player.ID)
                {
                        return;
                }
                this.photonView.RequestOwnership ();
                isTaken = true;
        }
        public void OnRotationTransform(float x, float y, float z){
                if(photonView.isMine){
                        if (isTaken) {
                                if (PhotonNetwork.player == this.photonView.owner)
                                        this.photonView.RPC ("RotationAngel", PhotonTargets.MasterClient, x, y, z);
                        }
                }
        }
        [PunRPC]
        void RotationAngel (float x, float y, float z) {
                _x = x;
                _y = y;
                _z = z;
                this.photonView.RPC ("RotationAngelAll", PhotonTargets.All, x, y, z);
        }
        [PunRPC]
        void RotationAngelAll (float x, float y, float z) {
                _x = x;
                _y = y;
                _z = z;
        }

        void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info){
                if (stream.isWriting) {
                        stream.SendNext (_x);
                        stream.SendNext (_y);
                        stream.SendNext (_z);
                        stream.SendNext (isTaken);
                } else {
                        _x = (float)stream.ReceiveNext();
                        _y = (float)stream.ReceiveNext();
                        _z = (float)stream.ReceiveNext();
                        isTaken = (bool)stream.ReceiveNext();
                }
        }
}
 
, заработало вроде только углы какие то ненормальные. Откуда они беруться такие?? А так сереалезуется успешно. Только осталась одна ошибка, когда перс отключается вместе с ружьём она вылазеет, и ружьё куда то пропадает с ним :)