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

Проблема с Instantiate и Destroy

СообщениеДобавлено: 24 фев 2014, 22:36
maxik
При создании мультиплеера возникла проблема: Когда Хп игрока доходит до отметки 0 игрок должен уничтожатся после чего создается объект мертвого игрока но юнити выдает такую ошибку:

Failed to 'network-remove' GameObject because it is missing a valid InstantiationId on view: View (0)0 on AlphaPlayerZombie (scene). Not Destroying GameObject or PhotonViews!
UnityEngine.Debug:LogError(Object)
PhotonHandler:DebugReturn(DebugLevel, String) (at Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonHandler.cs:170)
NetworkingPeer:DebugReturn(DebugLevel, String) (at Assets/Photon Unity Networking/Plugins/PhotonNetwork/NetworkingPeer.cs:802)
NetworkingPeer:RemoveInstantiatedGO(GameObject, Boolean) (at Assets/Photon Unity Networking/Plugins/PhotonNetwork/NetworkingPeer.cs:2271)
PhotonNetwork:Destroy(GameObject) (at Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonNetwork.cs:1740)
PlayerHealth:RecivedDmg(Int32, PhotonMessageInfo) (at Assets/Fiels/Scripts/Player/PlayerHealth.cs:47)
System.Reflection.MethodBase:Invoke(Object, Object[])
NetworkingPeer:ExecuteRPC(Hashtable, PhotonPlayer) (at Assets/Photon Unity Networking/Plugins/PhotonNetwork/NetworkingPeer.cs:1806)
NetworkingPeer:RPC(PhotonView, String, PhotonTargets, Object[]) (at Assets/Photon Unity Networking/Plugins/PhotonNetwork/NetworkingPeer.cs:2664)
PhotonNetwork:RPC(PhotonView, String, PhotonTargets, Object[]) (at Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonNetwork.cs:1907)
PhotonView:RPC(String, PhotonTargets, Object[]) (at Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonView.cs:254)
PlayerHealth:PlayerAttack(Int32) (at Assets/Fiels/Scripts/Player/PlayerHealth.cs:33)
AutoWeaponMultiplayer:Update() (at Assets/Fiels/Scripts/Weapons/Multiplayer/AutoWeaponMultiplayer.cs:57)

Вот скрипты:

Скрипт здоров'я игрока:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class PlayerHealth : Photon.MonoBehaviour {

        public int MaxHealth;
        public int Health;
        public EnergyBar HPBar;
        public GameObject DeadPlayer;
        public GameObject player;
        private bool isDie {get {return Health <= 0; }}
       
        void Start () {
        }

        void Update () {
        HPBar.valueMax = MaxHealth;
        HPBar.valueCurrent = Health;
        NetworkSpawn nspawn = GameObject.Find("!Spawn").GetComponent<NetworkSpawn>();
        if(Health <= 0){
                        nspawn.spawncol.enabled = true;
                        nspawn.cam.enabled = true;
                        nspawn.SpawnTimer = 5f;
                        nspawn.Cconttroller.enabled = true;
                        nspawn.MoveJoy.enabled = true;
                        nspawn.TurnJoy.enabled = true;
                }
        }
        public void PlayerAttack(int dmg){
                if(isDie)
                        return;
               
                photonView.RPC("RecivedDmg", PhotonTargets.AllBuffered, dmg);
        }

        [RPC]
        private void RecivedDmg(int dmg, PhotonMessageInfo info){
                if(isDie)
                        return;
               
                Health -= dmg;
               
                if(!PhotonNetwork.isMasterClient)
                        return;
               
                if(isDie){
                        PhotonNetwork.Destroy(gameObject);
                        PhotonNetwork.Instantiate(DeadPlayer.name,transform.position,transform.rotation, 4);

                        Storage.kills += 1;
                        Storage.PlayerMoney += 4000;
                }
        }
}


Скрипт оружия:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class AutoWeaponMultiplayer : Photon.MonoBehaviour {

        public int Damag;
        public int CurAmmoCount = 1;
    public int MaxAmmoCount = 1;
    public int CurCatrige = 9;  
        public float ReloadTimer = 0.0f;
        public float ReloadingTime;
        public float skorostrelnost = 0.1f;
        private float reloadskorostrel;
        public string splash;
        public bool CanFire;
        public AudioClip Firen;
        private RaycastHit Hit;
        private UILabel AmmoLabel;
        private UILabel Ammo2Label;
       
        void Start(){
        }
    void Update() {
                AmmoLabel = GameObject.Find("AmmoLabel").GetComponent<UILabel>();
                Ammo2Label = GameObject.Find("AmmoLabel2").GetComponent<UILabel>();
                AmmoLabel.text = "" + CurAmmoCount + "/" + MaxAmmoCount;
                Ammo2Label.text = "" + CurCatrige;
                if(photonView.isMine){
                        if(CanFire & reloadskorostrel <= 0){
                                if (CurAmmoCount>0 & ReloadTimer <= 0) {
                                        reloadskorostrel = skorostrelnost;
                                        audio.PlayOneShot(Firen);
                                        CurAmmoCount = CurAmmoCount - 1;
                                        PhotonNetwork.Instantiate(splash,transform.position,transform.rotation, 0);
                                        Vector3 DirectionRay = transform.TransformDirection(Vector3.forward);
                                        if(Physics.Raycast(transform.position, DirectionRay, out Hit, 100f))
                                        {
                                                if(Hit.rigidbody)
                                                {
                                                        Hit.rigidbody.AddForceAtPosition(DirectionRay*400f,Hit.point);
                                                }
                                                if(Hit.transform.GetComponent("AIHealth"))
                                                {
                                                        AIHealth AIH = (AIHealth)Hit.transform.GetComponent("AIHealth");
                                                        if(AIH.CurAiHealth > 0){
                                                                AIH.CurAiHealth -= Damag;
                                                        }
                                                }
                                                if(Hit.transform.GetComponent("ItemHealthExplo"))
                                                {
                                                        ItemHealthExplo IH = (ItemHealthExplo)Hit.transform.GetComponent("ItemHealthExplo");
                                                        IH.PlayerAttack(Damag);
                                                }
                                                if(Hit.transform.GetComponent("PlayerHealth"))
                                                {
                                                        PlayerHealth PH = (PlayerHealth)Hit.transform.GetComponent("PlayerHealth");
                                                        PH.PlayerAttack(Damag);
                                                }
                                        }

                 }
                }
                if (CurAmmoCount==0&CurCatrige>0&ReloadTimer<=0)
             {
            ReloadTimer = ReloadingTime;
            CurCatrige = CurCatrige - MaxAmmoCount;
            CurAmmoCount = MaxAmmoCount;  
         }
                if(ReloadTimer>0)                    
        {
           ReloadTimer -= Time.deltaTime;
        }
                if(reloadskorostrel>0)
                {
                        reloadskorostrel -= Time.deltaTime;
                }
                if(CurAmmoCount == 0 && ReloadTimer<=0)                    
        {

        }
                }
        }
        void Fire(){
                CanFire = true;
        }
        void NotFire(){
                CanFire = false;
        }
}


Помогите пожалуйста решить проблему.

Re: Проблема с Instantiate и Destroy

СообщениеДобавлено: 25 фев 2014, 15:46
waah
Синтаксис:
Используется csharp
PhotonNetwork.Destroy(gameObject);

может:
Синтаксис:
Используется csharp
PhotonNetwork.Destroy(DeadPlayer);

Re: Проблема с Instantiate и Destroy

СообщениеДобавлено: 25 фев 2014, 15:54
maxik
DeadPlayer это объект который создается когда игрок умерает.
Скрипт здоров'я висит на живом игроке
Мы удоляем живого игрока когда его хп доходят до отметки 0 и одновременно создаем объект DeadPlayer

Это работает у одного игрока если не использовать PhotonNetwork но проблема в том что етого действия тогда не видят остольные

Re: Проблема с Instantiate и Destroy

СообщениеДобавлено: 22 мар 2019, 15:26
boronnikovAI
Столкнулся с аналогичной проблемой.
Суть заключается в том, что Photon пытается уничтожить объект, который он не создавал.
Решил проблему тем, что создал "спавнер" объектов, который через Photon инстанцирует объекты(PhotonNetwork.Instantiate()), которые могут быть уничтожены.

Re: Проблема с Instantiate и Destroy

СообщениеДобавлено: 09 апр 2019, 12:52
AngryCat
boronnikovAI писал(а):Столкнулся с аналогичной проблемой.
Суть заключается в том, что Photon пытается уничтожить объект, который он не создавал.
Решил проблему тем, что создал "спавнер" объектов, который через Photon инстанцирует объекты(PhotonNetwork.Instantiate()), которые могут быть уничтожены.
Удалить объект, может только тот игрок, который его создал. Если же это SceanObject, то создавать и удалаять его может только Мастер Клиент.