Метод PunRP C не может создать экземпляр gameObject на всех клиентах - PullRequest
0 голосов
/ 05 февраля 2020

Для тех, кто уже знаком с Photon2, я хочу попросить о помощи.

Я пытаюсь выполнить простую функцию стрельбы, и единственное, что нужно сделать, - создать экземпляр игры BulletObject. , Но по какой-то причине происходит то, что при вызове функции RP C для выполнения выстрела каждый игрок выполняет свой выстрел изолированно, не вмешиваясь ни в что на экране другого (то есть каждый игрок создает объект только в его клиент, объект не существует для клиента другого). Если я создаю экземпляр объекта с помощью PhotonNetwork.Instantiate (), он выполняется правильно, но я слышал, что в идеале лучше избегать использования этой функции для многих объектов, поскольку она замедляет работу сервера, поэтому я действительно хотел иметь возможность сделать это с помощью Модификатор PunRP C!

Если это все равно поможет, вот несколько фрагментов кода из контроллера игрока и контроллера пули

Код, относящийся к игроку:


 void Update()
    {
        if(!playerView.IsMine)
            return;
        PlayerMove();
        PlayerRotation();
        /*if(Input.GetKeyDown(KeyCode.U))
            HealthUpdate(-10f);
        */
        if(Input.GetKeyDown(KeyCode.E)){
            //ShootBullet();
            playerView.RPC("NetworkShootBullet",RpcTarget.All);
        }


    }


    public void ShootBullet(){
        PhotonNetwork.Instantiate("myBullet",bulletSpawn.transform.position,bulletSpawn.transform.rotation);
    }


    [PunRPC]
    public void NetworkShootBullet(){
        Instantiate(bulletSprite,bulletSpawn.transform.position,bulletSpawn.transform.rotation);
    }

если вам нужна дополнительная информация о коде игрока, вот полная информация: https://pastebin.com/d231WEHp

если вышеприведенного недостаточно, вот источник сценария Bullet gameObject:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class BulletController : MonoBehaviourPun
{

    public Rigidbody2D rigid;
    public float bulletSpeed;
    public float bulletLifeTime;
    public float bulletTimeCount;
    public Vector2 bulletDirection;
    public Vector2 initialPos;

    public PhotonView bulletView;


    public void SetDirection(Vector2 bulletDirection,Vector2 initialPos){
        this.bulletDirection = bulletDirection;
        this.initialPos = initialPos;

    }
    void Start()
    {
        rigid = gameObject.GetComponent<Rigidbody2D>();
        bulletView = gameObject.GetComponent<PhotonView>();
        bulletSpeed = 100f;
        bulletLifeTime = 5f;
        moveBullet();
    }

    // Update is called once per frame
    void Update()
    {
        if(bulletTimeCount > bulletLifeTime){
            Destroy(gameObject);
        }
        bulletTimeCount += Time.deltaTime;            
    }

    void OnCollisionEnter2D(Collision2D collision){
        //check if collided with a player prefab that isn't yours
        if(collision.gameObject.name.Equals("myPlayer")){
            PlayerController collidedPlayer = collision.gameObject.GetComponent<PlayerController>();
            if(!collidedPlayer.playerView.IsMine){
                collidedPlayer.HealthUpdate(-10f);
                Destroy(gameObject);
            }
        }
    }

    public void moveBullet(){

        rigid.AddForce(transform.up*bulletSpeed,ForceMode2D.Force);

    }
}

1 Ответ

0 голосов
/ 06 февраля 2020

Это то, что вы ищете: Создание фотонов вручную

Вам необходимо связать экземпляр объекта с ViewID в сети, кэшировать его и вызвать / перехватить событие

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...