using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class OffLineConfig : MonoBehaviour
{
// 坦克的Transform组件
public Transform tank;
// 坦克旋转速度
public float speedR;
// 坦克材质
public Material materialTank;
// 滑杆数组
public Slider[] color;
// 名字
public Text playerNameText;
// 提示信息
public Text markedText;
// 坦克颜色
private Color tankColor;
// Update is called once per frame
void Update()
{
// 加负号是为了绕y轴逆时针旋转
tank.Rotate(-Vector3.up * Time.deltaTime * speedR);
// 修改颜色
tankColor.r = color[0].value /255f;
tankColor.g = color[1].value /255f;
tankColor.b = color[2].value /255f;
materialTank.color = tankColor;
}
public void clickConfigBtn()
{
// 如果姓名为空
if(playerNameText.text == "")
{
// 提示
markedText.color = Color.red;
markedText.text = "名字不能为空!!!";
}
else
{
// 记录姓名、颜色
PlayerPrefs.SetString("playerName", playerNameText.text);
PlayerPrefs.SetFloat("tankR", tankColor.r);
PlayerPrefs.SetFloat("tankG", tankColor.g);
PlayerPrefs.SetFloat("tankB", tankColor.b);
// 切换场景
SceneManager.LoadScene(1);
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 引用mirror
using Mirror;
// 继承NetworkBehaviour
public class TankControl : NetworkBehaviour
{
// 3DText,用于显示玩家姓名
public TextMesh player3DText;
// 坦克盖材质
public MeshRenderer RendererTank;
// 坦克头材质
public MeshRenderer RendererTankHead;
// 坦克左轮
public MeshRenderer RendererTankLeft;
// 坦克右轮
public MeshRenderer RendererTankRight;
// 存放
private Material playerMaterialClone;
// SynVar用于同步服务器和所有客户端的变量,变量只能在服务器上更改
// hook允许你创建一个在客户端的方法,当客户端上接受到更新的信息后,执行这个方法
[SyncVar(hook = nameof(OnNameChanged))]
public string playerName;
// 名字发生改变
void OnNameChanged(string _old, string _new)
{
player3DText.text = playerName;
}
[SyncVar(hook = nameof(OnColorChanged))]
public Color playerColor;
// 颜色发生变化TODO
void OnColorChanged(Color _old, Color _new)
{
// 为playerMaterialClone赋值,任何都可以,只要是material类型
playerMaterialClone = new Material(RendererTank.material);
playerMaterialClone.color = playerColor;
RendererTank.material = playerMaterialClone;
RendererTankHead.material = playerMaterialClone;
RendererTankLeft.material = playerMaterialClone;
RendererTankRight.material = playerMaterialClone;
}
// OnStartLocalPlayer 类似star(),只在本地玩家上被调用
public override void OnStartLocalPlayer()
{
// 获取玩家名字
string name = PlayerPrefs.GetString("playerName");
// 获取颜色一个颜色
Color tankColor = new Color(PlayerPrefs.GetFloat("tankR"), PlayerPrefs.GetFloat("tankG"), PlayerPrefs.GetFloat("tankB"));
// 调用方法,修改变量要在服务器端
cmdSetupPlayer(name, tankColor);
}
//Command,从客户端调用,但是在服务器上运行
[Command]
void cmdSetupPlayer(string _name, Color _color)
{
//玩家信息发送到服务器,然后服务器更新所有客户端上SyncVar变量
playerName = _name;
playerColor = _color;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 引用mirror
using Mirror;
// 继承NetworkBehaviour
public class TankControl : NetworkBehaviour
{
// 3DText,用于显示玩家姓名
public TextMesh player3DText;
// 坦克盖材质
public MeshRenderer RendererTank;
// 坦克头材质
public MeshRenderer RendererTankHead;
// 坦克左轮
public MeshRenderer RendererTankLeft;
// 坦克右轮
public MeshRenderer RendererTankRight;
// 存放
private Material playerMaterialClone;
// SynVar用于同步服务器和所有客户端的变量,变量只能在服务器上更改
// hook允许你创建一个在客户端的方法,当客户端上接受到更新的信息后,执行这个方法
[SyncVar(hook = nameof(OnNameChanged))]
public string playerName;
// 名字发生改变
void OnNameChanged(string _old, string _new)
{
player3DText.text = playerName;
}
[SyncVar(hook = nameof(OnColorChanged))]
public Color playerColor;
// 颜色发生变化TODO
void OnColorChanged(Color _old, Color _new)
{
// 为playerMaterialClone赋值,任何都可以,只要是material类型
playerMaterialClone = new Material(RendererTank.material);
playerMaterialClone.color = playerColor;
RendererTank.material = playerMaterialClone;
RendererTankHead.material = playerMaterialClone;
RendererTankLeft.material = playerMaterialClone;
RendererTankRight.material = playerMaterialClone;
}
// OnStartLocalPlayer 类似star(),只在本地玩家上被调用
public override void OnStartLocalPlayer()
{
// 获取玩家名字
string name = PlayerPrefs.GetString("playerName");
// 获取颜色一个颜色
Color tankColor = new Color(PlayerPrefs.GetFloat("tankR"), PlayerPrefs.GetFloat("tankG"), PlayerPrefs.GetFloat("tankB"));
// 调用方法,修改变量要在服务器端
cmdSetupPlayer(name, tankColor);
}
//Command,从客户端调用,但是在服务器上运行
[Command]
void cmdSetupPlayer(string _name, Color _color)
{
//玩家信息发送到服务器,然后服务器更新所有客户端上SyncVar变量
playerName = _name;
playerColor = _color;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 引用mirror
using Mirror;
// 继承NetworkBehaviour
public class TankControl : NetworkBehaviour
{
// 3DText,用于显示玩家姓名
public TextMesh player3DText;
// 坦克材质
public Material materialTank;
// 坦克颜色
private Color tankColor;
// OnStartLocalPlayer 类似star(),只在本地玩家上被调用
public override void OnStartLocalPlayer()
{
player3DText.text = PlayerPrefs.GetString("playerName");
tankColor.r = PlayerPrefs.GetFloat("tankR");
tankColor.g = PlayerPrefs.GetFloat("tankG");
tankColor.b = PlayerPrefs.GetFloat("tankB");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 引用mirror
using Mirror;
// 继承NetworkBehaviour
public class TankControl : NetworkBehaviour
{
// 同步姓名、材质
// 3DText,用于显示玩家姓名
public TextMesh player3DText;
// 坦克盖材质
public MeshRenderer RendererTank;
// 坦克头材质
public MeshRenderer RendererTankHead;
// 坦克左轮
public MeshRenderer RendererTankLeft;
// 坦克右轮
public MeshRenderer RendererTankRight;
// 存放
private Material playerMaterialClone;
// 相机跟随+移动
private float moveSpeed = 5; // 坦克移动的速度
private float turnSpped = 5; // 坦克转向的速度
private Rigidbody rb; // 刚体组件
private Vector3 offset;//和相机的相对位置
Quaternion camRotation; //记录相机初始角度
// SynVar用于同步服务器和所有客户端的变量,变量只能在服务器上更改
// hook允许你创建一个在客户端的方法,当客户端上接受到更新的信息后,执行这个方法
[SyncVar(hook = nameof(OnNameChanged))]
public string playerName;
// 名字发生改变
void OnNameChanged(string _old, string _new)
{
player3DText.text = playerName;
}
[SyncVar(hook = nameof(OnColorChanged))]
public Color playerColor;
// 颜色发生变化TODO
void OnColorChanged(Color _old, Color _new)
{
// 为playerMaterialClone赋值,任何都可以,只要是material类型
playerMaterialClone = new Material(RendererTank.material);
playerMaterialClone.color = playerColor;
RendererTank.material = playerMaterialClone;
RendererTankHead.material = playerMaterialClone;
RendererTankLeft.material = playerMaterialClone;
RendererTankRight.material = playerMaterialClone;
}
// OnStartLocalPlayer 类似star(),只在本地玩家上被调用
public override void OnStartLocalPlayer()
{
// 获取玩家名字
string name = PlayerPrefs.GetString("playerName");
// 获取颜色一个颜色
Color tankColor = new Color(PlayerPrefs.GetFloat("tankR"), PlayerPrefs.GetFloat("tankG"), PlayerPrefs.GetFloat("tankB"));
// 调用方法,修改变量要在服务器端
cmdSetupPlayer(name, tankColor);
rb = GetComponent<Rigidbody>();
offset = Camera.main.transform.position - transform.position;
camRotation = Camera.main.transform.rotation;
}
// 物理动作尽量放到FixedUpdate中
void FixedUpdate()
{
// 如果不是本地玩家,不执行下面的代码
if (!isLocalPlayer) return;
// 相机跟随
Camera.main.transform.position = transform.position + offset;
// 控制转向--转向是y轴方向转向,水平变量控制
float h = Input.GetAxis("Horizontal");
// 控制前进
float v = Input.GetAxis("Vertical");
// 前进
rb.velocity = transform.forward * v * moveSpeed;
// 转向
rb.angularVelocity = transform.up * h * turnSpped;
}
//Command,从客户端调用,但是在服务器上运行
[Command]
void cmdSetupPlayer(string _name, Color _color)
{
//玩家信息发送到服务器,然后服务器更新所有客户端上SyncVar变量
playerName = _name;
playerColor = _color;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShellControl : MonoBehaviour
{
public float shellSpeed = 10; // 子弹速度
private Rigidbody shellRb; // 子弹刚体组件
public GameObject shellExplosionPrefab; // 子弹爆炸效果
// Start is called before the first frame update
void Start()
{
shellRb = GetComponent<Rigidbody>();
// 设置初速度,不能写到update中,速度只设置一次就好
shellRb.velocity = transform.forward * shellSpeed;
}
// 子弹碰撞到东西是爆炸
private void OnTriggerEnter(Collider other)
{
// 实例化爆炸效果
GameObject.Instantiate(shellExplosionPrefab, transform.position, transform.rotation);
// 删除子弹
Destroy(gameObject);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DestoryExplore : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
// 删除爆炸效果
GameObject.Destroy(gameObject, 1.5f);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 引用mirror
using Mirror;
// 继承NetworkBehaviour
public class TankControl : NetworkBehaviour
{
// 同步姓名、材质
// 3DText,用于显示玩家姓名
public TextMesh player3DText;
// 坦克盖材质
public MeshRenderer RendererTank;
// 坦克头材质
public MeshRenderer RendererTankHead;
// 坦克左轮
public MeshRenderer RendererTankLeft;
// 坦克右轮
public MeshRenderer RendererTankRight;
// 存放
private Material playerMaterialClone;
// 相机跟随+移动
private float moveSpeed = 5; // 坦克移动的速度
private float turnSpped = 5; // 坦克转向的速度
private Rigidbody rb; // 刚体组件
private Vector3 offset;//和相机的相对位置
Quaternion camRotation; //记录相机初始角度
// 发射子弹
public GameObject shellPrefab; // 子弹预制体
public Transform firePoint; // 发射点的Transform组件
// SynVar用于同步服务器和所有客户端的变量,变量只能在服务器上更改
// hook允许你创建一个在客户端的方法,当客户端上接受到更新的信息后,执行这个方法
[SyncVar(hook = nameof(OnNameChanged))]
public string playerName;
// 名字发生改变
void OnNameChanged(string _old, string _new)
{
player3DText.text = playerName;
}
[SyncVar(hook = nameof(OnColorChanged))]
public Color playerColor;
// 颜色发生变化TODO
void OnColorChanged(Color _old, Color _new)
{
// 为playerMaterialClone赋值,任何都可以,只要是material类型
playerMaterialClone = new Material(RendererTank.material);
playerMaterialClone.color = playerColor;
RendererTank.material = playerMaterialClone;
RendererTankHead.material = playerMaterialClone;
RendererTankLeft.material = playerMaterialClone;
RendererTankRight.material = playerMaterialClone;
}
// OnStartLocalPlayer 类似star(),只在本地玩家上被调用
public override void OnStartLocalPlayer()
{
// 获取玩家名字
string name = PlayerPrefs.GetString("playerName");
// 获取颜色一个颜色
Color tankColor = new Color(PlayerPrefs.GetFloat("tankR"), PlayerPrefs.GetFloat("tankG"), PlayerPrefs.GetFloat("tankB"));
// 调用方法,修改变量要在服务器端
cmdSetupPlayer(name, tankColor);
// 与相机的偏移量,相机 的初始角度
rb = GetComponent<Rigidbody>();
offset = Camera.main.transform.position - transform.position;
camRotation = Camera.main.transform.rotation;
}
// 物理动作尽量放到FixedUpdate中
void FixedUpdate()
{
// 如果不是本地玩家,不执行下面的代码
if (!isLocalPlayer) return;
// 相机跟随
Camera.main.transform.position = transform.position + offset;
// 控制转向--转向是y轴方向转向,水平变量控制
float h = Input.GetAxis("Horizontal");
// 控制前进
float v = Input.GetAxis("Vertical");
// 前进
rb.velocity = transform.forward * v * moveSpeed;
// 转向
rb.angularVelocity = transform.up * h * turnSpped;
// 如果按下空格键,射击
if (Input.GetKeyDown(KeyCode.Space))
{
// 射击
shoot();
}
}
//加上[Command]的方法,为客户端向服务器端发消息,让服务器执行此方法
[Command]
void shoot()
{
// 实例化子弹
GameObject go = Instantiate(shellPrefab, firePoint.position, firePoint.rotation);
// Spawn:在所有的客户端生成括号里面的物体
NetworkServer.Spawn(go);
}
//Command,从客户端调用,但是在服务器上运行
[Command]
void cmdSetupPlayer(string _name, Color _color)
{
//玩家信息发送到服务器,然后服务器更新所有客户端上SyncVar变量
playerName = _name;
playerColor = _color;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 引用mirror
using Mirror;
// 继承NetworkBehaviour
public class TankControl : NetworkBehaviour
{
// 同步姓名、材质
// 3DText,用于显示玩家姓名
public TextMesh player3DText;
// 坦克盖材质
public MeshRenderer RendererTank;
// 坦克头材质
public MeshRenderer RendererTankHead;
// 坦克左轮
public MeshRenderer RendererTankLeft;
// 坦克右轮
public MeshRenderer RendererTankRight;
// 存放
private Material playerMaterialClone;
// 相机跟随+移动
private float moveSpeed = 5; // 坦克移动的速度
private float turnSpped = 5; // 坦克转向的速度
private Rigidbody rb; // 刚体组件
private Vector3 offset;//和相机的相对位置
Quaternion camRotation; //记录相机初始角度
// 发射子弹
public GameObject shellPrefab; // 子弹预制体
public Transform firePoint; // 发射点的Transform组件
// 坦克血量
int hp = 20;
// SynVar用于同步服务器和所有客户端的变量,变量只能在服务器上更改
// hook允许你创建一个在客户端的方法,当客户端上接受到更新的信息后,执行这个方法
[SyncVar(hook = nameof(OnNameChanged))]
public string playerName;
// 名字发生改变
void OnNameChanged(string _old, string _new)
{
player3DText.text = playerName;
}
[SyncVar(hook = nameof(OnColorChanged))]
public Color playerColor;
// 颜色发生变化TODO
void OnColorChanged(Color _old, Color _new)
{
// 为playerMaterialClone赋值,任何都可以,只要是material类型
playerMaterialClone = new Material(RendererTank.material);
playerMaterialClone.color = playerColor;
RendererTank.material = playerMaterialClone;
RendererTankHead.material = playerMaterialClone;
RendererTankLeft.material = playerMaterialClone;
RendererTankRight.material = playerMaterialClone;
}
// OnStartLocalPlayer 类似star(),只在本地玩家上被调用
public override void OnStartLocalPlayer()
{
// 获取玩家名字
string name = PlayerPrefs.GetString("playerName");
// 获取颜色一个颜色
Color tankColor = new Color(PlayerPrefs.GetFloat("tankR"), PlayerPrefs.GetFloat("tankG"), PlayerPrefs.GetFloat("tankB"));
// 调用方法,修改变量要在服务器端
cmdSetupPlayer(name, tankColor);
// 与相机的偏移量,相机 的初始角度
rb = GetComponent<Rigidbody>();
offset = Camera.main.transform.position - transform.position;
camRotation = Camera.main.transform.rotation;
}
// 物理动作尽量放到FixedUpdate中
void FixedUpdate()
{
// 如果不是本地玩家,不执行下面的代码
if (!isLocalPlayer) return;
// 相机跟随
Camera.main.transform.position = transform.position + offset;
// 控制转向--转向是y轴方向转向,水平变量控制
float h = Input.GetAxis("Horizontal");
// 控制前进
float v = Input.GetAxis("Vertical");
// 前进
rb.velocity = transform.forward * v * moveSpeed;
// 转向
rb.angularVelocity = transform.up * h * turnSpped;
// 如果按下空格键,射击
if (Input.GetKeyDown(KeyCode.Space))
{
// 射击
shoot();
}
}
//加上[Command]的方法,为客户端向服务器端发消息,让服务器执行此方法
[Command]
void shoot()
{
// 实例化子弹
GameObject go = Instantiate(shellPrefab, firePoint.position, firePoint.rotation);
// Spawn:在所有的客户端生成括号里面的物体
NetworkServer.Spawn(go);
}
//Command,从客户端调用,但是在服务器上运行
[Command]
void cmdSetupPlayer(string _name, Color _color)
{
//玩家信息发送到服务器,然后服务器更新所有客户端上SyncVar变量
playerName = _name;
playerColor = _color;
}
// 进入的是子弹
private void OnCollisionEnter(Collision collision)
{
// 这个判断需要在服务器端调用,不能是客户端,如果发现卡顿,就会出现问题
if(collision.gameObject.tag == "Shell" && isServer)
{
// 谁碰到谁减血
NetworkIdentity networkIdentity = GetComponent<NetworkIdentity>();
TakeDamage(networkIdentity.connectionToClient);
}
}
[TargetRpc]
void TakeDamage(NetworkConnection connection)
{
if (hp <= 0) return; // 如果血量小于0,直接返回
hp -= 10; // 伤害
//第一次 血量变成0
if (hp <= 0)
{
// 将目标客户端上的isPlayerDead,设置为True
GameManager.instance.isPlayerDead = true;
// 删除这个坦克,在服务器上删除,其他的客户端都会删
DestroyTank();
}
}
[Command]
void DestroyTank()
{
NetworkServer.Destroy(this.gameObject);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Mirror;
public class GameManager : NetworkBehaviour
{
// 为了在其他脚本中,更好的调用,制作成单例
public static GameManager instance;
// 判断玩家是否死亡
public bool isPlayerDead = false;
private void Awake()
{
instance = this;
}
private void Update()
{
// 如果按下p键并且isPlayerDead为True,才能重生
if (Input.GetKeyDown(KeyCode.P) && isPlayerDead )
{
// 重新设置摄像机的位置
Camera.main.transform.position = new Vector3(0f, 3.5f, -9.5f);
// 重新生成玩家
NetworkClient.AddPlayer();
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Mirror;
using UnityEngine.UI;
public class GameManager : NetworkBehaviour
{
// 为了在其他脚本中,更好的调用,制作成单例
public static GameManager instance;
// 判断玩家是否死亡
public bool isPlayerDead = false;
// 创建列表,存储每一道题
List<QuestionData> quests = new List<QuestionData>();
// 显示题目的面板
public GameObject panel;
// 答案
public Text answer;
// 问题
public Text question;
// 题目序号
int n = 0;
private void Awake()
{
instance = this;
// 加载问题文件
TextAsset questiondata = Resources.Load<TextAsset>("question1");
string a = questiondata.text;
foreach (var item in a.Split('\n'))
{
QuestionData q = new QuestionData();
string[] b = item.Split(',');
q.question = b[0];
// 大坑:1、编码格式不同 2、没有清除前后的空格
q.answer = b[1].Trim();
quests.Add(q);
}
// 设置初始问题
question.text = quests[n].question;
}
private void Update()
{
// 如果按下p键并且isPlayerDead为True,才能重生
if (Input.GetKeyDown(KeyCode.P) && isPlayerDead )
{
// 显示问题面板
panel.SetActive(true);
}
}
public void Check()
{
// 如果回答对
if (answer.text == quests[n].answer)
{
// 随机一个序号
n = Random.Range(0, quests.Count - 1);
question.text = quests[n].question;
// 隐藏问题面板
panel.SetActive(false);
// 设置isPlayerDead为false
isPlayerDead = false;
// 重新设置摄像机的位置
Camera.main.transform.position = new Vector3(0f, 3.5f, -9.5f);
// 重新生成玩家
NetworkClient.AddPlayer();
}
}
}
// 题类
public class QuestionData
{
// 问题
public string question;
// 答案
public string answer;
}