2016-11-23 5 views
1

Я хочу, чтобы все игроки могли двигаться и бросать геймобжекты в сцене с помощью этого сценария:Как создать скрипт для всех игроков 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(). Когда я использую этот скрипт , оба игрока могут перемещать объекты sceneObjects, но перемещение объекта не происходит (позиции позиций не обновляются для других игроков). Также, когда один из игроков бросает gameObject в на стену, которая разрушает новые столкновения с PhotonNetwork.Destroy(), , этот игрок замерзает на месте для других. Надеюсь, что мой вопрос не супер грязный. Заранее спасибо!

ответ

0

Если игрок без полномочий над объектом обрабатывает его, изменения не будут синхронизироваться с другими игроками. Чтобы сделать это, каждый игрок должен запросить право собственности на этот объект, используя метод photonView.RequestOwnership() перед тем, как набрать/выбросить/перенести его.

Существует также полный пример того, как запросить право собственности на пакет Photon Unity (DemoChangeOwner-Scene.unity).

+0

Спасибо за ваш ответ, я уже пробовал экспериментировать с photonView.RequestOwnership(), но не смог, я также проверил DemoChangeOwner-Scene и поместил функцию photonView.RequestOwnership() в функцию pickup(), но не сделал этого, т работы. Можете ли вы сказать мне, пожалуйста, в какой функции я должен писать? –

+0

Вы должны звонить каждый раз, когда игроку необходимо изменить преобразование объекта, которым он не является владельцем. Просто помните, что для того, чтобы изменить владельца объекта, свойство OwnershipOption должно быть настроено на запрос или принятие. – Jansen

+0

My gameObject's photonView настроен на запрос, я также поместил функцию photoonView.RequestOwnership() в функцию (() function => в функции Update(), что плохо, но я хотел ее протестировать. И все же это не сработает. Оба игрока замораживаются друг с другом после попытки захвата объекта. ................ Debug.Log: Ev OwnershipRequest: {245 = System.Int32 [], 254 = 1} ViewID: 1001 из: 1 Время: 709 ..... ............. Ev OwnershipRequest PhotonView.ownershipTransfer: Перенос .ownerId: 1 isOwnerActive: True. Игрок этого клиента: # 01 '' {} –

Смежные вопросы