//此脚本用于网络连接和创建玩家

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.Networking;

public class OneScript : NetworkBehaviour{
public Button StartServerButton;  //开启服务器的按钮
public Button ConnectServerButton;//连接服务器的按钮
public InputField IPInputField; // 用来填写IP地址的文字框
public InputField userNameInputField; // 输入玩家姓名
int Port = 6666; // 端口
NetworkClient client; //客户端对象
public GameObject TankPrefabs; //坦克的预制体
Transform Birthtransform; //玩家诞生的位置

//一开始就调用
void Awake()
{
//布尔语句表示在后台运行
application.runInBackground = true;

//产生玩家的步骤
//第一步、移除所有按钮的事件
StartServerButton.onClick.RemoveAllListeners();
ConnectserverButton.onClick.RemoveAllListeners();

//第二步、给按钮添加事件
StartServerButton.onClick.AddListener(StartServer); //开启服务器
ConnectServerButton.onClick.AddListener(ConnectClient); //连接客户端

//初始化各个客户端对象
client = new NetworkClient ();

//获取玩家出生地的父物体
TankPrefabs = GameObject.Find("TanksCreatePositin").GetComponent<Transform>();

}

//第三步、开启服务器
void StartServer()
{
//若网络服务器为处于服务状态
if(NetworkServer.active == false)
{
//监听端口,开启服务器,IP默认为本机的IP
NetworkServer.Listen(Port);
//注册服务器回调事件
NetworkServer.RegisterHandler(MsgType.Addplayer,OnAddplayerServer);

//创建并连接一个本地的客户端
client = ClientScence.ConnnectLocalServer();
client.RegisterHandler(MsgType.Connect,OnConnectClient);
client.RegisterHandler(MsgType.DisConnect,OnDisConnectClient);

}else
{
Debug.Log("已经开启服务器");
}
}

//第四步、客户端连接到服务器
        void ConnectClient()
{
//如果客户端处于未连接状态
if(client.isConnected == false)
{
string ip;
//如果IP输入框未填写
if(IPInputField.text == "")
{
//IP地址为本机IP地址
ip = "127.0.0.1";
}else{
//否则就是输入框输入的IP地址
ip = IPInputField.text;
}
//根据端口和IP来连接服务器
client.Connect(ip,Port);

//第五步,注册客户端的回调事件
client.RegisterHandler(MsgType.Connect,OnConnectClient);
client.RegisterHandler(MsgType.DisConnect,OnDisConnectClient);
}else{
Debug.Log("服务器已经已经连接成功");
}
}

//第六步、客户端回调,客户端连接到服务器事件
void OnConnectClient(NetworkMessage netMsg)
{
//准备好卵生对象
ClientScence.Ready (netMsg.conn);
//往客户端注册玩家
ClientScence.RegisterPrefab (TankPrefabs);
//告诉服务器添加新的玩家
ClientScence.AddPlayer (0);
}

void OnDisConnectClient(NetworkMessage netMsg)
{
Debug.Log("服务器断开连接");
}

//第七步、客户端添加玩家的回调事件
void OnAddplayerServer(NetworkMessage netMsg)
{
//如果连接的人数超过四个
if(netMsg.conn.connectionId > 4)
{
//断开连接
netMsg.conn.Disconnect();
}else{
//connectionId对应当前玩家在全部玩家中的连接服务器的先后位置
Vector3 pos = Birthtransform.GetChild(netMsg.conn.connectionId).Position;
//实例化玩家对象
GameObject player = Instantiate(TankPrefabs,pos,Quaternion.identity) as GameObject;
//服务器给关联的客户端添加对象
NetworkServer.AddPlayerForConnection(netMsg.conn,player,0);
//卵生到所有关联的客户端上
NetWorkServer.Spawn(player);
}

}
}

//该脚本用于控制坦克

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using UnityEngine.UI;

public class TwoScript : NetworkBehaviour{
//同步玩家的姓名
[SyncVar]
string PlayerName;
//同步玩家血条的颜色
[SyncVar]
Color HealthColor;

//子弹的预设体
public GameObject BulletPrefabs;
//子弹产生的位置
Transform BulletPosition;
//摄像机移动的目标点
Transform WatchPoint;
//坦克的血条
Slider healthSlider;

[SyncVar]
float Hp = 100;
Void Awake()
{
WatchPoint = transform.Find("watchpoint").transform;
BulletPosition = transform.Find("FireTransform").transform;
healthSlider = transform.Find(""HealthCanvas/Slider"").GetComponent<Slider>();

}

void Start()
{
//开启协程放在最外面,这样服务器才可以去执行协程中Tank模型赋值的方法
StartCoroutine(SyncAttribute());
//如果是本地玩家
if(isLocalPlayer){
string name;
InputField userNameInputField = GameObject.Find("NameInputField").GetComponent<InputField>();
if(userNameInputField.text == "")
{
name = "null";
}else{
name = userNameInputField.text;
}
Color color = new Color();
Transform Toggles  =GameObject.Find("Toggles_Color").GetComponent<Transform>();
for(int i = 0; i < Toggles.childCount; i++)
{
Transform toggle = Toggles.GetChild(i);
if(toggle.GetComponent<Toggle>().isOn){
color = toggle.GetComponentInChildren<Image> ().color;
break;
}
}
//给服务器发送命令,改变玩家姓名,血条颜色
CmdChangeColorAndName(name,color);
//在玩家数据同步之后,改变相机视角
Camera.main.GetComponent<CameraScript>().setTarget(WatchPoint);
//客户端场景注册子弹预设体
ClientScence.RegisterPrefab(BulletPrefabs);

}

[Command]
void CmdChangeColorAndName(string name,Color C)
{
PlayerName = name;
HealthColor = C;
}

IEnumerator SyncAttribute()
{
yield return new WaitForSeconds(1);
//将刚刚同步好的(玩家姓名和血条颜色)赋值给坦克对象身上
transform.Find("NameCanvas/NameDisplay").GetComponent<Text>().text = PlayerName ;
transform.Find(""HealthCanvas/Slider/Fill Area/Fill"").GetComponent<Image>().color = HealthColor ;
}

[ClientCallback]
void Update()
{
healthSlider.value = Hp;
if(isLocalPlayer)
{
//坦克移动
float Hor = Input.GetAxis ("Horizontal");
float Ver = Input.GetAxis ("Vertical");
transform.Rotate (Vector3.up * 60 * Time.deltaTime * Hor);
transform.Translate (Ver * 5 * Time.deltaTime * Vector3.forward);

if(Input.GetKeyDown(KeyCode.Space))
{
}
}
}
[Command]
void CmdCreateCun()
{
GameObject Bullet = Instantiate(BulletPrefabs,BulletPosition.Position,transform.rotation) as GameObject;
Bullet.GetComponent<Rigibody>().velocity = transform.forward *Bulletplay.GetComponent<BulletScript>().Speed;
}

[Command]
public void CmdDanage(float damage){
Hp -= damage;

}

//该脚本用于控制子弹
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class ThreeScript : NetworkBehaviour {
public float Speed;
public GameObject explosionPrefabs;
void Start () {
//注册爆炸预制体
ClientScene.RegisterPrefab(explosionPrefabs);
}

void OnTriggerEnter(Collider other)
{
if (other.transform.tag == "Tank") {
other.GetComponent<TankScript> ().CmdDanage (10);
}
CmdCreateExplosion ();
Destroy (gameObject);
}

[Command]
void CmdCreateExplosion()
{
//实例化你的爆炸物体
GameObject explos = Instantiate (explosionPrefabs, transform.position, Quaternion.identity) as GameObject;
//卵生同步
NetworkServer.Spawn (explos);
Destroy (explos, 1.5f);
}
}

//该脚本用于控制摄像机

using UnityEngine;
using System.Collections;

public class FourScript : MonoBehaviour {
//相机移动的目标点
Transform target;
public float Speed = 3;

void Start () {
//保证在后台运行
Application.runInBackground = true;
}

void Update () {
if (target == null) {
return;
}
//只是让相机向给定的目标点移动
transform.position = Vector3.Lerp (transform.position, target.position, Speed * Time.deltaTime);
//让相机随目标点移动
transform.rotation = Quaternion.Lerp(transform.rotation,target.rotation,Speed * Time.deltaTime);
}

//设置相机的移动的目标
public void SetTarget(Transform T)
{
target = T;
}
}

制作一个二人对战坦克游戏相关推荐

  1. 使用UE4制作简单的局域网对战小游戏

    原帖地址:https://arcecho.github.io/2017/04/28/使用UE4制作简单的局域网对战小游戏/ 大多数文章都是只讲到大致的UE4网络的概念,并未涉及实际使用.事实上在使用的 ...

  2. 怎样制作一个二维MG动画

    制作一个二维MG动画需要使用特定的软件,如 Adobe Flash,Toon Boom Harmony,Spine,DragonBones 等. 具体的制作步骤如下: 准备素材:需要准备的素材包括二维 ...

  3. 使用 Node 开发一个多人对战的射击游戏

    点击上方 前端瓶子君,关注公众号 回复算法,加入前端编程面试算法每日一题群 来源:我系小西几呀 https://juejin.cn/post/6960096410305822751 相信大家都是知道游 ...

  4. Node 开发一个多人对战的射击游戏(实战长文)

    点击上方 程序员成长指北,关注公众号 回复1,加入高级 Node 进阶交流群 来源:我系小西几呀 https://juejin.cn/post/6960096410305822751 相信大家都是知道 ...

  5. 用Unity制作一个很火的找不同游戏,包括核心玩法与关卡编辑器工具的实现

    玩家们心里都清楚,其实游戏的品类超级多,有些人喜欢玩moba.射击竞技类的,有些人喜欢塔防.策略.回合制类的,而又有些人喜欢经营养成.休闲益智类的.休闲益智类游戏,虽没像moba类游戏的激烈操作带来的 ...

  6. 利用Python做一个简单的对战小游戏

    利用Python做一个简单的文字对战小游戏 一.游戏介绍 1.大体介绍:文字版的对战小游戏,可以利用Python随机生成两个角色,角色带有各自的血量和攻击值两个指标.两人在对战时同时攻击对方,同时造成 ...

  7. 多人对战小游戏快速开发实例分享(附源码)

    前言:该游戏项目主要是基于前端引擎Cocos Creator开发,涉及后端联网的部分,则通过接入Matchvs SDK完成快速开发工作. 准备工作:相关引擎工具引擎下载及指南 Matchvs Java ...

  8. python编写多人对战小游戏

    编写小游戏 开发中的类的继承 灵活使用函数和函数的继承以及类class的实例 import time import randomclass WeGame(object):def __init__(se ...

  9. 前端: 如何利用Qrcode制作一个二维码生成器?

    玲琅满目的二维码在我们的都市和朋友圈中随处可见, 很多平台都提供了定制二维码的服务, 那么作为一名程序员, 我们如何自己实现一个简单的二维码生成器呢? 接下来笔者就来带大家一起利用Qrcode实现一个 ...

最新文章

  1. iOS 中捕获程序崩溃日志
  2. VTK修炼之道10:可视化管道的连接与执行
  3. Angular - angular2升级到angular8
  4. 乡镇快递站20万入股50%,每天派件600,是否靠谱?
  5. mysql 慢日志报警_一则MySQL慢日志监控误报的问题分析
  6. php active控件,php – 使用TbActiveForm选择列表中的动态选项
  7. 什么是微调(Fine Tune)?什么时候使用什么样的微调?【数据量和数据相似度决定】
  8. 一文快速理解Java反射(详细对比图)
  9. 程序员被沦陷!国内程序员真的饱和了?
  10. CSocket,CAsyncSocket多线程退出时的一些注意事项(解决关闭WinSoket崩溃的问题)
  11. PAT (Basic Level) Practice1004 成绩排名
  12. 开启3389的方法记录
  13. Qt更改字体为思源黑体
  14. wordpress文章增加行楷和魏碑字体
  15. 大型高端OA协同办公系统源码分享
  16. SAP软件的强大“远不止于此”
  17. 批量命名矩阵matlab,[转]matlab命名规则
  18. Arab Security Cyber Wargames 2022 Qualifications corCTF 部分题解
  19. 松鼠的新家 LCA + 树上差分
  20. CS131-Lecture2:颜色与线性代数

热门文章

  1. 2022爱分析· RPA厂商全景报告 | 爱分析报告
  2. BJOI2017 魔法咒语
  3. Java:四大内部类详解及总结
  4. 小米M365滑板车出现严重性漏洞恐遭远程攻击
  5. shell sleep毫秒_Shell脚本之date、sleep、usleep命令
  6. Mac 关闭Chrome自动更新功能
  7. 计算机学院篮球队介绍,重庆邮电大学计算机学院男子篮球队夺得学校篮球比赛亚军...
  8. wordpress禁用谷歌字体,提高古腾堡编辑器速度
  9. 人事行政人员必备办公软件|免费
  10. 声速的测量的实验原理和应用_大学物理实验报告声速测量