Question by
hejlskov · Jul 25, 2016 at 06:04 PM ·
unity 5instantiatemultiplayer
Problem with UNET: spawning instances like line renderes and bullets and make them show correctly on all clients
I have written this code for a multiplayer shooter that I'm currently working on. It does two things and it all works perfectly in offline-mode. 1. The "Fire" function uses raycasts to determine if the player hits another player and then visualizes it by instantiating a line renderer between the two points. 2. The "ThrowBomb" function just instantiates a prefab and shoots it with simple physics.
The problem is however that the line renderer doesnt show up correctly on all clients but only seemingly on the host. Not even the one sending the command sees the line. Is something wrong with my [Command] calls? Should they be changed or?
Here is the script:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class PlayerShoot : NetworkBehaviour {
public float fireRate;
private float nextFireTime;
public int bombCount;
public float throwForce;
public new Camera camera;
public GameObject bulletPrefab;
public GameObject bombPrefab;
public Collider playerCollider;
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
if (isLocalPlayer == false)
return;
if (Input.GetButtonDown("Fire1") && Time.time > nextFireTime) {
Fire();
nextFireTime = Time.time + fireRate;
}
if (Input.GetButtonDown("Fire2") && bombCount > 0) {
CmdThrowBomb();
bombCount--;
}
}
void Fire() {
RaycastHit[] raycastHits;
GameObject nearestHitObject = null;
Vector3 nearestHitPoint = Vector3.zero;
float nearestDistance = 0;
raycastHits = (Physics.RaycastAll(camera.transform.position, camera.transform.forward, 100));
foreach (var raycastHit in raycastHits) {
if (raycastHit.transform.root != transform.root) {
if (raycastHit.distance < nearestDistance || nearestHitObject == null) {
nearestDistance = raycastHit.distance;
nearestHitObject = raycastHit.transform.gameObject;
nearestHitPoint = raycastHit.point;
}
}
}
if (nearestHitPoint != Vector3.zero) {
if (nearestHitObject != null) {
CmdHit(nearestHitObject);
CmdSpawnBullet(camera.transform.position, nearestHitPoint);
}
else
Debug.LogError("No nearest hit object! This should not happen!");
}
else
CmdSpawnBullet(camera.transform.position, camera.transform.position + (camera.transform.forward * 100));
}
[Command]
void CmdThrowBomb() {
GameObject bomb = Instantiate(bombPrefab, camera.transform.position, Quaternion.identity) as GameObject;
Physics.IgnoreCollision(playerCollider, bomb.GetComponent<Collider>());
Rigidbody rigidBody = bomb.GetComponent<Rigidbody>();
rigidBody.AddForce(camera.transform.forward * throwForce);
TrailRenderer trailRenderer = bomb.GetComponent<TrailRenderer>();
trailRenderer.material = new Material(Shader.Find("Particles/Additive"));
trailRenderer.material.SetColor("_TintColor", Color.red);
NetworkServer.Spawn(bomb);
}
[Command]
void CmdHit(GameObject hitObject) {
if (hitObject.transform.root.tag == "Player" && hitObject.transform.root != transform.root)
hitObject.transform.root.GetComponent<NetworkPlayer>().RpcResolveHit();
}
[Command]
void CmdSpawnBullet(Vector3 startPosition, Vector3 endPosition) {
GameObject bullet = Instantiate(bulletPrefab, camera.transform.position, Quaternion.identity) as GameObject;
LineRenderer lineRenderer = bullet.GetComponent<LineRenderer>();
lineRenderer.SetPosition(0, startPosition);
lineRenderer.SetPosition(1, endPosition);
lineRenderer.material = new Material(Shader.Find("Particles/Additive"));
lineRenderer.SetColors(Color.red, Color.red);
NetworkServer.Spawn(bullet);
Destroy(bullet, 0.5f);
}
}
Comment