#unity3d #photon
#unity3d #фотон
Вопрос:
Я использую photon pun2 для создания сетей. это простая сцена выбора и броска, в которой игроки по сети пытаются выбрать и бросить мяч. Моя сцена содержит мяч, который игроки могут выбирать и бросать. При выборе объекта я делаю кинематику мяча истинной, а для кинематики броска — ложной, используя punrpc и ipunobersvable
синхронизация кинематики жесткого тела по сети является проблемой. таким образом, кинематика жесткого тела переключается между выкл. и вкл.
Я использую photonrigidbodyview для синхронизации по сети. скорость и угловая скорость с преобразованием идеально синхронизированы.
Вот этот код
private void Start()
{
animator = GetComponent<Animator>();
ball = GameObject.Find("IceBall").transform;
rb = GameObject.Find("IceBall").GetComponent<Rigidbody>();
coll = GameObject.Find("IceBall").GetComponent<SphereCollider>();
//ballContainer = player.Find("ObjectGuide").transform;
//fpsCamera = player.Find("CameraHolder").transform;
//setup
if (!equipped)
{
rb.isKinematic = false;
coll.isTrigger = false;
}
else
{
rb.isKinematic = true;
coll.isTrigger = true;
slotFull = true;
}
}
private void Update()
{
Vector3 distanceToPlayer = ball.position - transform.position;
if(!equipped amp;amp; distanceToPlayer.magnitude<=pickupRange amp;amp; Input.GetKeyDown(KeyCode.E)amp;amp;!slotFull)
{
photonView.RPC("PickUp", RpcTarget.AllBuffered, true);
}
if(equipped amp;amp; Input.GetKey(KeyCode.Q))
{
photonView.RPC("Drop", RpcTarget.AllBuffered, false);
}
}
[PunRPC]
public void PickUp(bool _kinematic)
{
if(equipped == false amp;amp; slotFull == false)
{
equipped = true;
slotFull = true;
Debug.Log("ball is equipped " equipped);
ball.GetComponent<PhotonView>().TransferOwnership(PhotonNetwork.LocalPlayer);
rb.isKinematic = _kinematic;
coll.isTrigger = true;
//Make ball a child of the camera and move it to default position
if (photonView.IsMine)
{
ball.parent = ballContainer;
ball.localPosition = Vector3.zero;
ball.localRotation = Quaternion.Euler(Vector3.zero);
}
}
}
[PunRPC]
public void Drop(bool _kinematic)
{
if(equipped == true amp;amp; slotFull == true)
{
ball.GetComponent<PhotonView>().TransferOwnership(null);
animator.SetTrigger("IsThrowBall");
equipped = false;
slotFull = false;
//set parent to null
ball.SetParent(null);
//Make Rigidbody is not Kinematic and BoxCollider normal
rb.isKinematic = _kinematic;
coll.isTrigger = false;
//Ball carries momentum of player
//addforce
rb.AddForce(fpsCamera.forward * dropForwardForce, ForceMode.Impulse);
rb.AddForce(fpsCamera.up * dropUpwardForce, ForceMode.Impulse);
}
}
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.IsWriting)
{
// We own this player: send the others our data
stream.SendNext(rb.isKinematic);
stream.SendNext(coll.isTrigger);
}
else
{
// Network player, receive data
this.rb.isKinematic = (bool)stream.ReceiveNext();
this.coll.isTrigger = (bool)stream.ReceiveNext();
}
}
Комментарии:
1. Вы сказали: «Я использую photonrigidbodyview для синхронизации по сети. скорость и угловая скорость с преобразованием идеально синхронизированы «. Так в чем же проблема ?
2. синхронизация кинематических свойств rigidbody по сети является проблемой.
3. Тогда я бы предложил заглянуть в SyncVar, или вам нужно использовать команды и вызовы Rpc для их синхронизации.