Для тех, кто уже знаком с 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);
}
}