Hi, I am creating an RTS, and the BuildingPlacer script gets created as a player in Mirror for every client.
But, executing a Command called private void CmdPlaceBuilding(GameObject building, Vector3 position), the GameObject becomes null, even though it is not null before passing it. Can someone help me?
using UnityEngine;
using Mirror;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class BuildingPlacement : NetworkBehaviour
{
[Header("Building options")]
public Building[] buildingPrefabs;
private Building currentBuilding;
private bool isClickPressed = false;
public Button buildingButton;
public string buildingButtonContainer;
[Header("Placement options")]
public LayerMask groundLayer;
private Vector3 hitPoint;
private void Start()
{
currentBuilding = buildingPrefabs[0];
foreach (Building building in buildingPrefabs)
{
GenerateButton(building);
}
}
void Update()
{
if (isLocalPlayer)
{
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity, groundLayer))
{
if (isClickPressed)
{
Debug.Log(hit.point);
hitPoint = hit.point;
//CmdPlaceBuilding(hit.point);
}
}
}
}
[Command]
private void CmdPlaceBuilding(GameObject building, Vector3 position)
{
Debug.Log(building);
GameObject buildingInstance = Instantiate(building, position, Quaternion.identity);
NetworkServer.Spawn(buildingInstance);
RpcOnPlaceBuilding();
}
[ClientRpc]
private void RpcOnPlaceBuilding()
{
//Debug.Log("Called on client!");
}
private void GenerateButton(Building building)
{
Button newButton = Instantiate(buildingButton, GameObject.Find(buildingButtonContainer).transform);
newButton.transform.Find("Icon").GetComponent<Image>().sprite = building.icon;
newButton.transform.Find("Data").transform.Find("Name").GetComponent<TMPro.TextMeshProUGUI>().text = building.displayName;
Debug.Log(building.prefab);
newButton.onClick.AddListener(() => CmdPlaceBuilding(building.prefab, hitPoint));
}
public void OnClick(InputAction.CallbackContext context)
{
isClickPressed = context.ReadValueAsButton();
}
}