- Home /
Question by
Mahaganr · Nov 18, 2016 at 07:43 AM ·
networkingmultiplayerlanscoring
Trying to sync score on multiplayer LAN game
So I'm developing a game where two players pick up items and when the time limit is up, the person with the most items wins. I've done extensive reading and video-watching on UNET attributes but I still have some problems I can't solve. For starters, I want each player to be able to see their own score and their opponent's score.
My playercontroller script:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using UnityEngine.UI;
public class PlayerController : NetworkBehaviour
{
public GameObject bulletPrefab;
public Transform bulletSpawn;
public GameObject sproutPrefab;
public Transform sproutSpawn;
public Image carried;
public Text holding;
bool goldAcorn = false;
int acornStash = 0;
private IEnumerator Wait()
{
yield return new WaitForSeconds(30);
}
public override void OnStartLocalPlayer()
{
GetComponent<MeshRenderer>().material.color = Color.gray;
}
void Update()
{
if (!isLocalPlayer)
{
GetComponent<PlayerController>().enabled = false;
GetComponentInChildren<Camera>().enabled = false;
return;
}
var x = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;
var z = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
transform.Rotate(0, x, 0);
transform.Translate(0, 0, z);
if (goldAcorn != true) {
carried.enabled = false;
}
if (goldAcorn == true)
{
carried.enabled = true;
if (Input.GetKeyDown(KeyCode.Space))
{
CmdFire();
}
if (Input.GetKeyDown(KeyCode.V))
{
CmdPlant();
}
}
if (this.gameObject.GetComponent<Timer>().seconds == 0 && this.gameObject.GetComponent<Timer>().minutes == 0)
{
GetComponent<PlayerController>().enabled = false;
}
}
void OnCollisionEnter(Collision other)
{
if (isLocalPlayer)
{
if (other.gameObject.CompareTag("Acorn"))
{
Destroy(other.gameObject);
acornStash += 1;
holding.text = "Acorns held: " + acornStash;
}
if (other.gameObject.CompareTag("Gold Acorn"))
{
goldAcorn = true;
Destroy(other.gameObject);
}
if (other.gameObject.CompareTag("Base"))
{
this.gameObject.GetComponent<Score>().AcornScore(acornStash);
holding.text = "Acorns held: 0";
acornStash = 0;
}
if (other.gameObject.tag == "Sprout")
{
if (Input.GetKeyDown(KeyCode.B))
{
Destroy(other.gameObject);
this.gameObject.GetComponent<Score>().DigScore();
}
}
if (other.gameObject.tag == "Bullet")
{
this.gameObject.GetComponent<Score>().TakeDamage();
}
}
if (!isLocalPlayer)
{
if (other.gameObject.CompareTag("Acorn"))
{
Destroy(other.gameObject);
acornStash += 1;
holding.text = "Acorns held: " + acornStash;
}
if (other.gameObject.CompareTag("Gold Acorn"))
{
goldAcorn = true;
Destroy(other.gameObject);
}
if (other.gameObject.CompareTag("Base"))
{
this.gameObject.GetComponent<Score2>().AcornScore(acornStash);
holding.text = "Acorns held: 0";
acornStash = 0;
}
if (other.gameObject.tag == "Sprout")
{
if (Input.GetKeyDown(KeyCode.B))
{
Destroy(other.gameObject);
this.gameObject.GetComponent<Score2>().DigScore();
}
}
if (other.gameObject.tag == "Bullet")
{
this.gameObject.GetComponent<Score2>().TakeDamage();
}
}
}
public void callGS()
{
if (isLocalPlayer)
{
this.gameObject.GetComponent<Score>().GoldScore();
}
if (!isLocalPlayer)
{
this.gameObject.GetComponent<Score2>().GoldScore();
}
}
[Command]
void CmdFire()
{
var bullet = (GameObject)Instantiate(
bulletPrefab,
bulletSpawn.position,
bulletSpawn.rotation);
bullet.transform.parent = transform;
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 10;
NetworkServer.Spawn(bullet);
Destroy(bullet, 5.0f);
goldAcorn = false;
}
[Command]
void CmdPlant()
{
var sprout = (GameObject)Instantiate(
sproutPrefab,
sproutSpawn.position,
sproutSpawn.rotation);
NetworkServer.Spawn(sprout);
Destroy(sprout, 15.0f);
goldAcorn = false;
if (isLocalPlayer)
{
this.gameObject.GetComponent<Score>().SproutScore();
}
if (!isLocalPlayer)
{
this.gameObject.GetComponent<Score2>().SproutScore();
}
}
}
One of my score scripts:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System.Collections;
using System;
public class Score : NetworkBehaviour
{
[SyncVar(hook = "DisplayBlueScore")]
public int blueScore = 0;
public Text scoreBlue;
void Awake()
{
DisplayBlueScore (blueScore);
}
[Server]
public void GoldScore()
{
RpcGoldScore();
}
[Server]
public void SproutScore()
{
RpcSproutScore();
}
[Server]
public void DigScore()
{
RpcDigScore();
}
[Server]
public void AcornScore(int stash)
{
RpcAcornScore(stash);
}
[Server]
public void TakeDamage()
{
RpcTakeDamage ();
}
[ClientRpc]
void RpcTakeDamage()
{
blueScore -= 10;
if (blueScore <= 0)
{
blueScore = 0;
}
DisplayBlueScore(blueScore);
}
[ClientRpc]
void RpcAcornScore(int stash)
{
blueScore += stash;
DisplayBlueScore(blueScore);
}
[ClientRpc]
void RpcGoldScore()
{
blueScore += 10;
DisplayBlueScore(blueScore);
}
[ClientRpc]
void RpcSproutScore()
{
for (int x = 0; x < 3; ++x)
{
blueScore += 10;
DisplayBlueScore(blueScore);
StartCoroutine(Wait());
}
}
[ClientRpc]
void RpcDigScore()
{
blueScore += 10;
DisplayBlueScore(blueScore);
}
public void DisplayBlueScore(int score)
{
scoreBlue.text = string.Format("B: {0}", score);
}
private IEnumerator Wait()
{
yield return new WaitForSeconds(5);
}
}
I have two similar Score scripts but one is redScore instead of blueScore. Side note: I'm also having problems with syncing the timer for the game.
I'll provide any extra information necessary. Thanks!
Comment