Search Unity

Third Party [PUN2] What am i doing wrong?

Discussion in 'Multiplayer' started by unity_bfvNwgs4mDhzgw, Dec 2, 2021.

  1. unity_bfvNwgs4mDhzgw

    unity_bfvNwgs4mDhzgw

    Joined:
    Apr 22, 2020
    Posts:
    5
    i want to sync portal shooting for my portal game, heres my code but i don't know how to pass a RaycastHit in a PunRPC. by the way i also have a portalcamera script. The portals work perfectly fine. But they don't when using PUN2 but i do not know how to pass a RaycastHit in a PunRPC
    My code:
    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using Photon.Pun;
    5.  
    6. public class PortalShooter : MonoBehaviourPun
    7. {
    8.  
    9.     public GameObject orangePortalPrefab;
    10.     public GameObject bluePortalPrefab;
    11.  
    12.     public GameObject blueCameraPrefab;
    13.     public GameObject orangeCameraPrefab;
    14.  
    15.     public Material orangeOpen;
    16.     public Material orangeClosed;
    17.     public Material blueOpen;
    18.     public Material blueClosed;
    19.  
    20.     private GameObject orangePortal;
    21.     private GameObject bluePortal;
    22.     private GameObject orangeCamObject;
    23.     private GameObject blueCamObject;
    24.  
    25.     private PortalCamera orangeCamera;
    26.     private PortalCamera blueCamera;
    27.     public AudioSource Blue, Orange;
    28.     public int id;
    29.     public Transform cur;
    30.     RaycastHit hit;
    31.  
    32.     // Use this for initialization
    33.     void Start()
    34.     {
    35.         transform.name = GetComponent<PhotonView>().ViewID.ToString();
    36.         orangePortal = Instantiate<GameObject>(orangePortalPrefab);
    37.         bluePortal = Instantiate<GameObject>(bluePortalPrefab);
    38.         orangeCamObject = Instantiate<GameObject>(orangeCameraPrefab);
    39.         blueCamObject = Instantiate<GameObject>(blueCameraPrefab);
    40.         orangePortal.GetComponentInChildren<Teleporter>().destination = bluePortal.transform.Find("Destination");
    41.         bluePortal.GetComponentInChildren<Teleporter>().destination = orangePortal.transform.Find("Destination");
    42.         orangeCamera = orangeCamObject.GetComponent<PortalCamera>();
    43.         orangeCamera.associatedPortal = orangePortal.transform.Find("Surface");
    44.         orangeCamera.oppositePortal = bluePortal.transform.Find("Surface");
    45.         orangeCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = orangeClosed;
    46.         orangeCamera.playerCam = transform;
    47.         blueCamera = blueCamObject.GetComponent<PortalCamera>();
    48.         blueCamera.associatedPortal = bluePortal.transform.Find("Surface");
    49.         blueCamera.oppositePortal = orangePortal.transform.Find("Surface");
    50.         blueCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = blueClosed;
    51.         blueCamera.playerCam = transform;
    52.     }
    53.  
    54.     // Update is called once per frame
    55.     void Update()
    56.     {
    57.         if (Input.GetButtonDown("Fire2") && photonView.IsMine)
    58.         {
    59.  
    60.             PlacePortal("OrangePortalv2(Clone)");
    61.            
    62.            
    63.             Orange.Play();
    64.            
    65.         }
    66.         else if (Input.GetButtonDown("Fire1") && photonView.IsMine)
    67.         {
    68.            
    69.             PlacePortal("BluePortalv2(Clone)");
    70.            
    71.            
    72.             Blue.Play();
    73.            
    74.         }
    75.     }
    76.  
    77.     private void UpdatePortalsMaterials()
    78.     {
    79.         if (bluePortal.activeSelf)
    80.         {
    81.             orangeCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = orangeOpen;
    82.         }
    83.         else
    84.         {
    85.             orangeCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = orangeClosed;
    86.         }
    87.         if (orangePortal.activeSelf)
    88.         {
    89.             blueCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = blueOpen;
    90.         }
    91.         else
    92.         {
    93.             blueCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = blueClosed;
    94.         }
    95.     }
    96.  
    97.    
    98.     private void PlacePortal(string ObjectName)
    99.     {
    100.        
    101.        
    102.         GameObject portal;
    103.         portal = GameObject.Find(ObjectName);
    104.         if (Physics.Raycast(transform.position, transform.forward, out hit))
    105.         {
    106.             photonView.RPC("ReallyPlaceThem", RpcTarget.All, ObjectName);
    107.         }
    108.        
    109.     }
    110.  
    111.     private bool ValidatePortalPosition(GameObject portal, Collider associatedSurface)
    112.     {
    113.         Transform up, down, left, right;
    114.         up = portal.transform.Find("PortalTop");
    115.         down = portal.transform.Find("PortalBottom");
    116.         left = portal.transform.Find("PortalLeft");
    117.         right = portal.transform.Find("PortalRight");
    118.  
    119.         return IsOnCollider(up, associatedSurface) &&
    120.                 IsOnCollider(down, associatedSurface) &&
    121.                 IsOnCollider(left, associatedSurface) &&
    122.                 IsOnCollider(right, associatedSurface);
    123.     }
    124.  
    125.     private bool IsOnCollider(Transform point, Collider col)
    126.     {
    127.         RaycastHit hit;
    128.         if (Physics.Raycast(point.position, -point.forward, out hit, 0.1f))
    129.         {
    130.             return hit.collider == col;
    131.         }
    132.         return false;
    133.     }
    134.  
    135.  
    136.     [PunRPC]
    137.     public void ReallyPlaceThem(string Obj)
    138.     {
    139.         GameObject portal;
    140.         portal = GameObject.Find(Obj);
    141.         if (hit.transform.tag != "OpenableSurface")
    142.         {
    143.             return;
    144.         }
    145.         portal.transform.position = hit.point;
    146.         Vector3 lookPos = transform.position;
    147.         lookPos.y = portal.transform.position.y;
    148.         portal.transform.LookAt(lookPos);
    149.  
    150.         float surfaceAngle = Vector3.Angle(hit.normal, Vector3.up);
    151.         if (surfaceAngle < 35.0f || surfaceAngle > 145.0f)
    152.         {
    153.             portal.transform.LookAt(hit.point + hit.normal, transform.up);
    154.         }
    155.         else
    156.         {
    157.             portal.transform.LookAt(hit.point + hit.normal);
    158.         }
    159.  
    160.         portal.transform.Translate(0.0f, 0.0f, 0.01f);
    161.         bool validPosition = ValidatePortalPosition(portal, hit.collider);
    162.         if (validPosition)
    163.         {
    164.             BodyDetector detector = portal.GetComponentInChildren<BodyDetector>();
    165.             detector.associatedSurface = hit.collider;
    166.             detector.InitializeCollidersList();
    167.             portal.SetActive(true);
    168.  
    169.             if (portal == orangePortal)
    170.             {
    171.                 orangeCamera.RecalculateHolePositions();
    172.                 detector.otherDetector = bluePortal.GetComponentInChildren<BodyDetector>();
    173.             }
    174.             else if (portal == bluePortal)
    175.             {
    176.                 blueCamera.RecalculateHolePositions();
    177.                 detector.otherDetector = orangePortal.GetComponentInChildren<BodyDetector>();
    178.             }
    179.         }
    180.         UpdatePortalsMaterials();
    181.     }
    182. }
    183.  
     
  2. tobiass

    tobiass

    Joined:
    Apr 7, 2009
    Posts:
    3,067
    You can't pass that to a RPC method. RaycastHit is not a type PUN can de/serialize out of the box.
    If it's about 2 objects with a PhotonView on them, you could get their `viewId` values and send those.