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

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

Сообщение maxik 24 фев 2014, 22:36

При создании мультиплеера возникла проблема: Когда Хп игрока доходит до отметки 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;
        }
}


Помогите пожалуйста решить проблему.
maxik
UNец
 
Сообщения: 25
Зарегистрирован: 26 сен 2013, 18:52

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

Сообщение waah 25 фев 2014, 15:46

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

может:
Синтаксис:
Используется csharp
PhotonNetwork.Destroy(DeadPlayer);
Аватара пользователя
waah
UNец
 
Сообщения: 12
Зарегистрирован: 15 сен 2010, 09:42
Откуда: Украина, Кривой Рог
  • ICQ

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

Сообщение maxik 25 фев 2014, 15:54

DeadPlayer это объект который создается когда игрок умерает.
Скрипт здоров'я висит на живом игроке
Мы удоляем живого игрока когда его хп доходят до отметки 0 и одновременно создаем объект DeadPlayer

Это работает у одного игрока если не использовать PhotonNetwork но проблема в том что етого действия тогда не видят остольные
maxik
UNец
 
Сообщения: 25
Зарегистрирован: 26 сен 2013, 18:52

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

Сообщение boronnikovAI 22 мар 2019, 15:26

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

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

Сообщение AngryCat 09 апр 2019, 12:52

boronnikovAI писал(а):Столкнулся с аналогичной проблемой.
Суть заключается в том, что Photon пытается уничтожить объект, который он не создавал.
Решил проблему тем, что создал "спавнер" объектов, который через Photon инстанцирует объекты(PhotonNetwork.Instantiate()), которые могут быть уничтожены.
Удалить объект, может только тот игрок, который его создал. Если же это SceanObject, то создавать и удалаять его может только Мастер Клиент.
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099


Вернуться в Photon

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2