using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
void OnCollisionEnter(Collision col)
{
GameObject hit = col.gameObject;
Health health = hit.GetComponent<Health>();
if (health != null)
{
health.TakeDamage(10);
}
Destroy(this.gameObject);
}
}
血量控制脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class Health : NetworkBehaviour{
public const int maxHealth = 100;
[SyncVar(hook = "OnChangeHealth")] //同步下面这个字段 服务端和客户端 hook 是检测到maxHealth的值的变化 之后 调用OnChangeHealth方法
public int currentHealth = maxHealth;
public Slider healthSlider; //血条
public bool destroyOnDeath = false;
private NetworkStartPosition[] spawnPoints;
void Start()
{
if (isLocalPlayer)
{
spawnPoints = FindObjectsOfType<NetworkStartPosition>();
}
}
public void TakeDamage(int damage)
{
if (isServer == false)
return; //仅在服务端进行判断
currentHealth -= damage;
if (currentHealth <= 0)
{
if (destroyOnDeath)
{
Destroy(this.gameObject); return;
}
currentHealth = maxHealth;
RpcResPawn();
}
}
void OnChangeHealth(int health)
{
healthSlider.value = health / (float)maxHealth;
}
[ClientRpc] //客户端调用 以Rpc开头
void RpcResPawn()
{
if (isLocalPlayer == false)
{
return;
}
Vector3 spawnPosition = Vector3.zero;
if (spawnPoints != null && spawnPoints.Length > 0)
{
spawnPosition = spawnPoints[Random.Range(0, spawnPoints.Length)].transform.position;
}
transform.position = spawnPosition;
}
}
玩家管理脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking; //命名空间
public class PlayerController : NetworkBehaviour //继承NetworkBehaviour
{
public GameObject bulletPrefab; //子弹预设
public Transform bulletSpawn; //生成的初始位置
void Update () {
if (!isLocalPlayer) //isLocalPlayer 用来判断是否是本机玩家 是的话返回True 不是返回False
{
return;
}
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
transform.Rotate(Vector3.up * h * 128 * Time.deltaTime);
transform.Translate(Vector3.forward * v * 3 * Time.deltaTime);
if (Input.GetKeyDown(KeyCode.Space))
{
CmdFire();
}
}
public override void OnStartLocalPlayer()
{
//这个方法只会在本地角色哪里调用 当角色被创建的时候
GetComponent<MeshRenderer>().material.color = Color.blue;
}
/// <summary>
/// 开火 这个方法需要在Server调用
/// </summary>
[Command] //call in client,run in server 在服务端调用的方法 必须 以Cmd开头
public void CmdFire()
{
//子弹的生成 需要Server端,然后把子弹同步到客户端
GameObject bullet = Instantiate(bulletPrefab, bulletSpawn.position, bulletSpawn.rotation) as GameObject;
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 10;
Destroy(bullet, 2);
NetworkServer.Spawn(bullet); //指定一个物体 同步到所有客户端
}
}
这个脚本的作用就是让画布始终面对相机 控制血条不旋转
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LookAtCamera : MonoBehaviour {
void Update () {
transform.LookAt(Camera.main.transform);
}
}
生成敌人
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class EnemySpawner : NetworkBehaviour {
public GameObject enemyPrefab; //敌人的预设
public int numberOfEnemies; //数量
public override void OnStartServer()
{
for (int i = 0; i < numberOfEnemies; i++)
{
Vector3 position = new Vector3(Random.Range(-6f, 6f), 0, Random.Range(-6f, -6f));
Quaternion rotation = Quaternion.Euler(0, Random.Range(0, 360), 0);
GameObject enemy = Instantiate(enemyPrefab, position, rotation) as GameObject;
NetworkServer.Spawn(enemy);
}
}
}
以上代码为学习siki老师Network视频所码,仅用作复习浏览