Need help with getting a script from a game object spawned in as child object of player object in multiplayer
I need help desperately, I'm relatively new to programming but Im making a simple space shooter type game, player object gets spawned in, then chooses a ship with a script attached that has its specs pertaining to weapon damage and speed etc. The player object has a script that then gets the script from the ship. I get it to work perfectly fine on the host, but sadly not on the client, it spawns in fine, the ship spawns in too, but it does not get the component. Ive spent four days now trying to fix it but Im slightly out of my depth it seems and Ive reached the end of my rope. Any help would be greatly appreciated, clearly I'm missing something.
Here is my code, sorry if its ugly, as I said, Im new to this.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class ShipManager : NetworkBehaviour
{
public int ShipDamage { get; protected set; }
public int ShipDamageRange { get; protected set; }
public float ShipMoveSpeed { get; protected set; }
public float ShipTurnSpeed { get; protected set; }
public float ShipTiltSpeed { get; protected set; }
public float ShipTorqueSpeed { get; protected set; }
public float ShipRollSpeed { get; protected set; }
public int ShipMass { get; protected set; }
public static bool hasLockedIn;
[SerializeField]
GameObject[] spawnableShips;
GameObject selectedShip;
public ShipSpecs currentShipSpecs;
// Start is called before the first frame update
void Start()
{
hasLockedIn = false;
}
private void Update()
{
if(isLocalPlayer)
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
CmdSpawnShip1();
hasLockedIn = true;
}
if(Input.GetKeyDown(KeyCode.Alpha2))
{
CmdSpawnShip2();
hasLockedIn = true;
}
if (hasLockedIn)
{
ShipSetup();
}
}
}
void ShipSetup()
{
if(currentShipSpecs == null)
{
Debug.Log("No ship has been selected!");
return;
}
ShipDamage = currentShipSpecs.damage;
ShipDamageRange = currentShipSpecs.range;
ShipMoveSpeed = currentShipSpecs.moveSpeed;
ShipTiltSpeed = currentShipSpecs.tiltSpeed;
ShipTurnSpeed = currentShipSpecs.turnSpeed;
ShipTorqueSpeed = currentShipSpecs.torqueSpeed;
ShipRollSpeed = currentShipSpecs.rollSpeed;
ShipMass = currentShipSpecs.mass;
}
[Command]
void CmdSpawnShip1()
{
Debug.Log("Spawning " + spawnableShips[0].name);
selectedShip = spawnableShips[0];
GameObject selectedShipIns = (GameObject)Instantiate(selectedShip, transform.position, Quaternion.identity);
selectedShipIns.transform.SetParent(gameObject.transform);
currentShipSpecs = selectedShipIns.GetComponent<ShipSpecs>();
NetworkServer.SpawnWithClientAuthority(selectedShipIns, connectionToClient);
}
[Command]
void CmdSpawnShip2()
{
Debug.Log("Spawning " + spawnableShips[1].name);
selectedShip = spawnableShips[1];
GameObject selectedShipIns = (GameObject)Instantiate(selectedShip, transform.position, Quaternion.identity);
selectedShipIns.transform.SetParent(gameObject.transform);
currentShipSpecs = selectedShipIns.GetComponent<ShipSpecs>();
NetworkServer.SpawnWithClientAuthority(selectedShipIns, connectionToClient);
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220612213953im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Unity Photon Handle Match Data 0 Answers
Setting parent on spawned object Unet 0 Answers
Need help for Player Spawning and Player speed control slider!! 2 Answers
Is there a way to activate a child of an instantiated prefab only? 0 Answers
Executing command in a child GameObject in a multiplayer Game 2 Answers