- Home /
Question by
unity_bfvNwgs4mDhzgw · Dec 02, 2021 at 09:10 AM ·
multiplayerphotonportal
Does anyone know how to sync portal shooting for my portal game? [PHOTON PUN 2]
Probably a noob Question but How would i sync a RaycastHit value (i also have a portalcamera script if you want to see it) My code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class PortalShooter : MonoBehaviourPun
{
public GameObject orangePortalPrefab;
public GameObject bluePortalPrefab;
public GameObject blueCameraPrefab;
public GameObject orangeCameraPrefab;
public Material orangeOpen;
public Material orangeClosed;
public Material blueOpen;
public Material blueClosed;
private GameObject orangePortal;
private GameObject bluePortal;
private GameObject orangeCamObject;
private GameObject blueCamObject;
private PortalCamera orangeCamera;
private PortalCamera blueCamera;
public AudioSource Blue, Orange;
public int id;
public Transform cur;
RaycastHit hit;
// Use this for initialization
void Start()
{
transform.name = GetComponent<PhotonView>().ViewID.ToString();
orangePortal = Instantiate<GameObject>(orangePortalPrefab);
bluePortal = Instantiate<GameObject>(bluePortalPrefab);
orangeCamObject = Instantiate<GameObject>(orangeCameraPrefab);
blueCamObject = Instantiate<GameObject>(blueCameraPrefab);
orangePortal.GetComponentInChildren<Teleporter>().destination = bluePortal.transform.Find("Destination");
bluePortal.GetComponentInChildren<Teleporter>().destination = orangePortal.transform.Find("Destination");
orangeCamera = orangeCamObject.GetComponent<PortalCamera>();
orangeCamera.associatedPortal = orangePortal.transform.Find("Surface");
orangeCamera.oppositePortal = bluePortal.transform.Find("Surface");
orangeCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = orangeClosed;
orangeCamera.playerCam = transform;
blueCamera = blueCamObject.GetComponent<PortalCamera>();
blueCamera.associatedPortal = bluePortal.transform.Find("Surface");
blueCamera.oppositePortal = orangePortal.transform.Find("Surface");
blueCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = blueClosed;
blueCamera.playerCam = transform;
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire2") && photonView.IsMine)
{
PlacePortal("OrangePortalv2(Clone)");
Orange.Play();
}
else if (Input.GetButtonDown("Fire1") && photonView.IsMine)
{
PlacePortal("BluePortalv2(Clone)");
Blue.Play();
}
}
private void UpdatePortalsMaterials()
{
if (bluePortal.activeSelf)
{
orangeCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = orangeOpen;
}
else
{
orangeCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = orangeClosed;
}
if (orangePortal.activeSelf)
{
blueCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = blueOpen;
}
else
{
blueCamera.associatedPortal.GetComponent<Renderer>().sharedMaterial = blueClosed;
}
}
private void PlacePortal(string ObjectName)
{
GameObject portal;
portal = GameObject.Find(ObjectName);
if (Physics.Raycast(transform.position, transform.forward, out hit))
{
photonView.RPC("ReallyPlaceThem", RpcTarget.All, ObjectName);
}
}
private bool ValidatePortalPosition(GameObject portal, Collider associatedSurface)
{
Transform up, down, left, right;
up = portal.transform.Find("PortalTop");
down = portal.transform.Find("PortalBottom");
left = portal.transform.Find("PortalLeft");
right = portal.transform.Find("PortalRight");
return IsOnCollider(up, associatedSurface) &&
IsOnCollider(down, associatedSurface) &&
IsOnCollider(left, associatedSurface) &&
IsOnCollider(right, associatedSurface);
}
private bool IsOnCollider(Transform point, Collider col)
{
RaycastHit hit;
if (Physics.Raycast(point.position, -point.forward, out hit, 0.1f))
{
return hit.collider == col;
}
return false;
}
[PunRPC]
public void ReallyPlaceThem(string Obj)
{
GameObject portal;
portal = GameObject.Find(Obj);
if (hit.transform.tag != "OpenableSurface")
{
return;
}
portal.transform.position = hit.point;
Vector3 lookPos = transform.position;
lookPos.y = portal.transform.position.y;
portal.transform.LookAt(lookPos);
float surfaceAngle = Vector3.Angle(hit.normal, Vector3.up);
if (surfaceAngle < 35.0f || surfaceAngle > 145.0f)
{
portal.transform.LookAt(hit.point + hit.normal, transform.up);
}
else
{
portal.transform.LookAt(hit.point + hit.normal);
}
portal.transform.Translate(0.0f, 0.0f, 0.01f);
bool validPosition = ValidatePortalPosition(portal, hit.collider);
if (validPosition)
{
BodyDetector detector = portal.GetComponentInChildren<BodyDetector>();
detector.associatedSurface = hit.collider;
detector.InitializeCollidersList();
portal.SetActive(true);
if (portal == orangePortal)
{
orangeCamera.RecalculateHolePositions();
detector.otherDetector = bluePortal.GetComponentInChildren<BodyDetector>();
}
else if (portal == bluePortal)
{
blueCamera.RecalculateHolePositions();
detector.otherDetector = orangePortal.GetComponentInChildren<BodyDetector>();
}
}
UpdatePortalsMaterials();
}
}
Comment
by the way i don't know why it does all of those weird spaces between all lines
please try to sort that out. That code is unreadable..
If your issue is just that you cannot send a RayCastHit object as argument of a PunRPC then please look into creating custom datatypes for RPCs. There is a documentation on how to do that in PUN.
Please describe your issue a more thoroughly next time. As a rule of thumb if you have 30x more lines of code than you have text for your description something definetly is wrong.