私はすべてのプレイヤーがこのスクリプトとシーン にゲームオブジェクトを移動して投げることができるようにしたい:すべてのプレイヤーのためのスクリプトの作成方法Unity Photon?
[RequireComponent(typeof(PhotonView))]
public class PickupObjectNetwork : Photon.MonoBehaviour {
public GameObject mainCamera;
public bool carrying;
GameObject carriedObject;
public float distance;
public float smooth;
public float throwPower = 10f;
private float chargeTime = 0f;
// Use this for initialization
void Start() {
mainCamera = GameObject.FindWithTag("MainCamera");
}
// Update is called once per frame
void Update() {
if(photonView.isMine)
{
if(carriedObject == null)
{
carrying = false;
}
if(gameObject == null)
return;
if(carrying) {
photonView.RPC("carry", PhotonTargets.AllBuffered);
photonView.RPC("checkDrop", PhotonTargets.AllBuffered);
if (Input.GetMouseButtonUp (0)) {
float pushForce = chargeTime * 10;
pushForce = Mathf.Clamp (pushForce, 1, 20);
photonView.RPC("throwObject", PhotonTargets.AllBuffered, pushForce);
chargeTime = 0;
}
} else {
if(Input.GetKeyDown (KeyCode.E)) {
photonView.RPC("pickup", PhotonTargets.AllBuffered);
}
}
if(Input.GetMouseButton(0)){
chargeTime += Time.deltaTime;
}
}
}
[PunRPC]
void carry() {
if (carriedObject == null)
{
return;
}
Debug.Log("picked up object with id: " + carriedObject.GetComponent<PhotonView>().viewID);
carriedObject.transform.position = Vector3.Lerp (carriedObject.transform.position, mainCamera.transform.position + mainCamera.transform.forward * distance, Time.deltaTime * smooth);
carriedObject.transform.rotation = Quaternion.identity;
}
[PunRPC]
void pickup() {
int x = Screen.width/2;
int y = Screen.height/2;
Ray ray = mainCamera.GetComponent<Camera>().ScreenPointToRay(new Vector3(x,y));
RaycastHit hit;
if(Physics.Raycast(ray, out hit)) {
Pickupable p = hit.collider.GetComponent<Pickupable>();
if(p != null && hit.distance < 5) {
carrying = true;
carriedObject = p.gameObject;
p.gameObject.GetComponent<Rigidbody>().velocity = Vector3.zero;
p.gameObject.GetComponent<Rigidbody>().useGravity = false;
}
}
}
[PunRPC]
void checkDrop() {
if(Input.GetKeyDown (KeyCode.E)) {
dropObject();
}
}
[PunRPC]
void dropObject() {
carrying = false;
carriedObject.gameObject.GetComponent<Rigidbody>().useGravity = true;
carriedObject = null;
}
[PunRPC]
void throwObject(float pushForce){
carrying = false;
if(carriedObject.tag != "BoxMultiplayer")
carriedObject.tag = "Projectile";
carriedObject.GetComponent<Rigidbody>().AddForce(Camera.main.transform.forward * pushForce * 200);
carriedObject.gameObject.GetComponent<Rigidbody>().useGravity = true;
carriedObject = null;
}
}
私は PhotonNetwork.InstantiateSceneObjectを()を使用して、シーンオブジェクトをインスタンス化し、このスクリプトは マスタークライアントでのみ動作し、マスター以外のクライアントはオブジェクトを移動できません。
このスクリプトもランダムに試してみました。http://pastebin.com/7DgjZ9U7 AllocateViewId()で作業する方法は本当にわかりません。この スクリプトを使用すると、両方のプレイヤーがsceneObjectを移動できますが、オブジェクトの移動は ではありません(オブジェクトの位置は他のプレイヤーでは更新されません)。 また、プレーヤーの1人が の壁にゲームオブジェクトを投げたときに、PhotonNetwork.Destroy()で新しいコリジョンが破棄されると、 このプレーヤーは他の人のために固定されます。 私の質問は面倒ではないことを願っています。前もって感謝します!
私はphotonView.RequestOwnership()を試してみましたが、成功しませんでした。私はDemoChangeOwner-SceneもチェックしてphotonView.RequestOwnership()をpickup()関数に入れましたが、仕事。あなたは私にそれを書かなければならない機能を教えてくれますか? –
プレーヤーが所有者ではないオブジェクトの変形を変更する必要があるたびに呼び出す必要があります。オブジェクトの所有者を変更するには、OwnershipOptionをRequestまたはTakeoverに設定する必要があります。 – Jansen
私のgameObjectのphotonViewが要求するように設定されています。また、photonView.RequestOwnership()をcarry()function => Update()関数に入れました。そしてまだそれは動作しません。両方のプレイヤーは、オブジェクトをつかむのを試みた後、お互いのために凍結します。 ................ Debug.Log:Ev OwnershipRequest:{245 = System.Int32 []、254 = 1} ViewID:1001から:1時間:709 ..... ............. Ev OwnershipRequest PhotonView.ownershipTransfer:引き継ぎ.ownerId:1 isOwnerActive:True。このクライアントのプレーヤー:#01 '' {} –