【利用 Unity + Mirror 网络框架、Node.js 后端和 MySQL 数据库】

news2025/1/9 4:56:16

要实现一个简单的1v1战斗小游戏,利用 Unity + Mirror 网络框架、Node.js 后端和 MySQL 数据库,我们可以将其分为几个主要部分:客户端(Unity)、服务器(Node.js)和数据库(MySQL)。以下是实现的详细步骤和代码示例:

1. Unity 客户端实现

在 Unity 中,使用 Mirror 网络框架来处理玩家的网络连接、同步和玩家动作的管理。这个部分主要包括玩家的控制、网络同步、以及与后端的通信。

1.1 设置 Unity 项目

首先,安装 Mirror 网络框架:

  1. 在 Unity 中,打开 Window -> Package Manager
  2. 点击 Add package from git URL,然后输入 https://github.com/vis2k/Mirror.git 来安装 Mirror。
1.2 创建玩家和网络管理器
玩家控制脚本 (PlayerController.cs)

这个脚本用于控制玩家的移动、同步玩家状态以及与服务器进行通信。

using Mirror;
using UnityEngine;

public class PlayerController : NetworkBehaviour
{
 public float moveSpeed = 5f;
 private Rigidbody rb;

 private void Start()
 {
 if (isLocalPlayer)
 {
 rb = GetComponent<Rigidbody>();
 }
 }

 private void Update()
 {
 if (isLocalPlayer)
 {
 HandleMovement();
 }
 }

 private void HandleMovement()
 {
 float moveX = Input.GetAxis("Horizontal");
 float moveZ = Input.GetAxis("Vertical");

 Vector3 movement = new Vector3(moveX, 0, moveZ) * moveSpeed * Time.deltaTime;
 rb.MovePosition(transform.position + movement);
 }

 [Command]
 public void CmdAttack()
 {
 RpcAttack();
 }

 [ClientRpc]
 public void RpcAttack()
 {
 // 在客户端同步攻击动作
 Debug.Log("Player is attacking!");
 }
}
网络管理器 (GameNetworkManager.cs)

这个脚本负责处理连接、断开连接和玩家匹配等功能。

using Mirror;
using UnityEngine;

public class GameNetworkManager : NetworkManager
{
 public GameObject playerPrefab;

 public override void OnServerAddPlayer(NetworkConnection conn)
 {
 GameObject player = Instantiate(playerPrefab);
 NetworkServer.AddPlayerForConnection(conn, player);
 }

 public override void OnServerDisconnect(NetworkConnection conn)
 {
 base.OnServerDisconnect(conn);
 Debug.Log("Player disconnected.");
 }
}
1.3 设置玩家预制体
  1. 在 Unity 中创建一个简单的玩家角色(可以使用一个 Cube 或任何自定义模型)。
  2. 为玩家对象添加 RigidbodyNetworkIdentity 组件。
  3. NetworkManager 中设置玩家预制体为创建的玩家对象。
1.4 连接后端

在 Unity 中,我们使用 WebSocket 与后端进行通信,接收和发送玩家匹配信息。

using UnityEngine;
using WebSocketSharp;

public class WebSocketManager : MonoBehaviour
{
 private WebSocket ws;

 private void Start()
 {
 ws = new WebSocket("ws://localhost:8080");
 ws.OnMessage += OnMessageReceived;
 ws.Connect();
 }

 private void OnMessageReceived(object sender, MessageEventArgs e)
 {
 Debug.Log("Received message: " + e.Data);

 // 处理服务器返回的匹配信息
 if (e.Data.Contains("match_found"))
 {
 Debug.Log("Match found, start game!");
 }
 }

 public void SendMatchmakingRequest(int playerId)
 {
 string message = $"{{\"type\": \"matchmaking\", \"playerId\": {playerId}}}";
 ws.Send(message);
 }
}

2. Node.js 后端实现

Node.js 后端负责处理玩家匹配、管理游戏房间,并向客户端发送匹配成功的消息。WebSocket 用于与 Unity 客户端实时通信。

2.1 安装依赖

首先,安装必要的依赖:

npm install express mysql ws
2.2 创建 MySQL 数据库

在 MySQL 中创建一个简单的玩家表,用于存储玩家信息和匹配状态。

CREATE DATABASE game_db;

USE game_db;

CREATE TABLE players (
 id INT AUTO_INCREMENT PRIMARY KEY,
 player_name VARCHAR(255) NOT NULL,
 status ENUM('waiting', 'matched') DEFAULT 'waiting'
);
2.3 后端代码 (server.js)

Node.js 后端通过 WebSocket 与客户端通信,通过 MySQL 管理玩家的匹配状态。

const express = require('express');
const mysql = require('mysql');
const WebSocket = require('ws');

const app = express();
const port = 3000;

// 数据库连接
const db = mysql.createConnection({
 host: 'localhost',
 user: 'root',
 password: 'yourpassword',
 database: 'game_db'
});

db.connect((err) => {
 if (err) throw err;
 console.log('Connected to the database');
});

// WebSocket 服务器
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
 console.log('A player connected');

 ws.on('message', (message) => {
 console.log('Received: ' + message);
 const data = JSON.parse(message);

 if (data.type === 'matchmaking') {
 handleMatchmaking(ws, data.playerId);
 }
 });

 ws.on('close', () => {
 console.log('Player disconnected');
 });
});

// 玩家匹配逻辑
function handleMatchmaking(ws, playerId) {
 // 查找一个等待匹配的玩家
 db.query('SELECT * FROM players WHERE status = "waiting" LIMIT 1', (err, results) => {
 if (err) throw err;

 if (results.length > 0) {
 const opponent = results[0];

 // 更新玩家和对手的状态为 'matched'
 db.query('UPDATE players SET status = "matched" WHERE id = ?', [playerId], (err) => {
 if (err) throw err;
 });

 db.query('UPDATE players SET status = "matched" WHERE id = ?', [opponent.id], (err) => {
 if (err) throw err;
 });

 // 发送匹配成功消息
 ws.send(JSON.stringify({ type: 'match_found', opponent: opponent }));
 } else {
 // 没有找到对手,等待
 db.query('UPDATE players SET status = "waiting" WHERE id = ?', [playerId], (err) => {
 if (err) throw err;
 });

 // 发送等待消息
 ws.send(JSON.stringify({ type: 'waiting' }));
 }
 });
}
2.4 启动 Node.js 后端

启动 Node.js 后端服务器:

node server.js

3. 运行游戏

  1. 启动 Node.js 后端,并确保它能正常连接到 MySQL 数据库。
  2. 启动 Unity 游戏客户端,在客户端中测试玩家的匹配与战斗。

4. 游戏逻辑和战斗实现

在实际的战斗中,玩家可以通过攻击指令来与对方战斗。可以在 PlayerController 中通过命令(CmdAttack)来触发攻击动作,执行战斗判定。

你可以进一步扩展游戏逻辑,例如:

  • 玩家血量和攻击力。
  • 玩家移动、攻击动画和战斗判定。
  • 匹配到对手后,开始游戏。

总结

这个项目通过 UnityMirror 构建了一个基本的 1v1 在线游戏框架,通过 Node.js 后端处理匹配逻辑和数据库操作,实现了玩家之间的匹配与战斗功能。这个基础框架可以扩展为更复杂的游戏,例如增加更多玩家的匹配、更复杂的战斗系统等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java SpringBoot使用Apache POI导入导出Excel文件

点击下载《Java SpringBoot使用Apache POI导入导出Excel文件(源代码)》 1. Apache POI 简介 Apache POI 是一个强大的 Java 库&#xff0c;用于处理 Microsoft Office 文档&#xff0c;包括 Excel 文件&#xff08;.xls 和 .xlsx&#xff09;。在 Java Spring Boot 项目中&am…

unity学习14:unity里的C#脚本的几个基本生命周期方法, 脚本次序order等

目录 1 初始的C# 脚本 1.1 初始的C# 脚本 1.2 创建时2个默认的方法 2 常用的几个生命周期方法 2.1 脚本的生命周期 2.1.1 其中FixedUpdate 方法 的时间间隔&#xff0c;是在这设置的 2.2 c#的基本语法别搞混 2.2.1 基本的语法 2.2.2 内置的方法名&#xff0c;要求更严…

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#xff0c;前端携带账号和密码请求登录接口。服务…

Tableau数据可视化与仪表盘搭建-数据连接

目录 连接本地文件 课程操作 连接方式&#xff08;实时/数据提取&#xff09; 保存工作簿 筛选器 数据处理 连接数据有三种类型 第一种&#xff0c;连接到本地文件&#xff0c;例如Excel&#xff0c;csv&#xff0c;JSON等 第二种&#xff0c;连接到数据库&#xff0c;例…

AI人工智能大数据技术解锁竞彩足球分析软件准确率的密钥

AI 人工智能大数据技术解锁竞彩足球分析软件准确率的密钥 在信息爆炸的时代&#xff0c;竞彩足球愈发风靡&#xff0c;球迷们不再满足于单纯观赛&#xff0c;更渴望凭借精准预测&#xff0c;投身这场数字与激情交织的博弈。而大数据、人工智能技术催生出的专业软件&#xff0c;…

基于物联网疫苗冷链物流监测系统设计

1. 项目开发背景 随着全球对疫苗运输要求的提高&#xff0c;特别是针对温度敏感型药品&#xff08;如疫苗&#xff09;的冷链管理&#xff0c;如何保证疫苗在运输过程中的温度、湿度、震动等环境因素的稳定性已成为亟需解决的问题。疫苗运输过程中&#xff0c;任何温度或湿度的…

深入浅出Node.js-1(node.js入门)

全新专栏带你快速掌握node.js Node.js入门 html,css,js 30年了 nodejs环境 09年出现 15年 nodejs为我们解决了2个方面的问题&#xff1a; 【锦上添花】让我们前端工程师拥有了后端开发能力&#xff08;开接口&#xff0c;访问数据库&#xff09; - 大公司BFF&#xff08;5…

【线性代数】通俗理解特征向量与特征值

这一块在线性代数中属于重点且较难理解的内容&#xff0c;下面仅个人学习过程中的体会&#xff0c;错误之处欢迎指出&#xff0c;有更简洁易懂的理解方式也欢迎留言学习。 文章目录 概念计算几何直观理解意义 概念 矩阵本身就是一个线性变换&#xff0c;对一个空间中的向量应用…

Java-JVM详解

Java-JVM ①JVM概述 ❶基本介绍 JVM&#xff1a;全称 Java Virtual Machine&#xff0c;一个虚拟计算机&#xff0c;Java 程序的运行环境&#xff08;Java二进制字节码的运行环境&#xff09; 特点&#xff1a; Java 虚拟机基于二进制字节码执行&#xff0c;由一套字节码指…

【网络协议】开放式最短路径优先协议OSPF详解(三)

前言 在第一部分和第二部分&#xff0c;我们了解了OSPF操作背后的概念。在第三部分&#xff0c;我们将讨论多区域OSPF。我们将了解它与单区域OSPF的不同&#xff0c;并探讨其操作背后的各种概念。 【网络协议】开放式最短路径优先协议OSPF详解&#xff08;一&#xff09; 【…

【C语言】_指针与数组

目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1&#xff1a;函数体内计算sz&#xff08;sz不作实参传递&#xff09; 3.2 代码示例2&#xff1a;sz作为实参传递 3…

android开发从入门进阶到高级学习资料集合

本文精心整理了Android开发相关的学习资料&#xff0c;涵盖入门、进阶、性能优化、博客、面试和书籍等多个维度&#xff0c;在这里分享给大家&#xff0c;欢迎收藏。 技术社区 开源中国 OSCHINA是国内顶尖的开源技术社区之一&#xff0c;自2008年成立以来&#xff0c;已汇聚超…

腾讯云更改用户为root

最近买了台99元一年的2核的云服务器&#xff0c;方便学习一些java开发中间件&#xff0c;以及部署一些项目。 1.设置root用户密码 sudo passwd root 2.修改配置文件 ll /etc | grep ssh cd /etc/ssh/ ls vim sshd_config 输入/PasswordAuthentication 寻找 输入:set nu 再按下…

联发科MTK6771/MT6771安卓核心板规格参数介绍

MT6771&#xff0c;也被称为Helio P60&#xff0c;是联发科技(MediaTek)推出的一款中央处理器(CPU)芯片&#xff0c;可运行 android9.0 操作系统的 4G AI 安卓智能模块。MT6771芯片采用了12纳米工艺制造&#xff0c;拥有八个ARM Cortex-A73和Cortex-A53核心&#xff0c;主频分别…

Milvus×全诊通:从导诊到智能超声,如何将人效比翻倍

AI与智慧医疗的结合已是未来发展的必然趋势。近年来&#xff0c;国家卫健委推崇智慧医疗和AI技术&#xff0c;如智能导诊、预问诊、辅助诊断等&#xff0c;以提高医疗服务效率和诊断准确性&#xff0c;改善患者就医体验。 全诊通是一家专注于医疗SaaS和人工智能的公司&#xff…

C#使用MVC框架创建WebApi服务接口

第一步,使用VS2019新建MVC-Web API应用程序 创建BridgeApi 第二步,运行将生成默认的示例网页,网页Url为 https://localhost:44361/home/index 右键 项目 添加 WebAPI控制器类 添加 我们可以看到App_Start目录下 有三个文件: BundleConfig.cs代表 捆绑文件的引用 有脚本文件…

跨年烟花C++代码

嘿&#xff0c;朋友们&#xff01;今天来给大家讲讲一段挺有意思的C代码呀&#xff0c;这段代码主要是用来实现一个烟花效果展示的程序哦&#xff0c;下面咱们一点点来看哈。 效果 1. 开头包含的那些头文件 #include <graphics.h> #include <conio.h> #include &…

Unity 2d描边基于SpriteRender,高性能的描边解决方案

目标 以Unity默认渲染管线为例&#xff0c;打造不需要图片内边距&#xff0c;描边平滑&#xff0c;高性能的描边解决方案 前言 在2d游戏中经常需要给2d对象添加描边&#xff0c;来突出强调2d对象 当你去网上查找2d描边shader&#xff0c;移植到项目里面&#xff0c;大概率会…

自动驾驶相关知识学习笔记

一、概要 因为想知道SIL、HIL是什么仿真工具&#xff0c;故而浏览了自动驾驶相关的知识。 资料来源《自动驾驶——人工智能理论与实践》胡波 林青 陈强 著&#xff1b;出版时间&#xff1a;2023年3月 二、图像的分类、分割与检测任务区别 如图所示&#xff0c;这些更高阶的…

“深入浅出”系列之FFmpeg:(1)音视频开发基础

我的音视频开发大部分内容是跟着雷霄骅大佬学习的&#xff0c;所以笔记也是跟雷老师的博客写的。 一、音视频相关的基础知识 首先播放一个视频文件的流程如下所示&#xff1a; FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据&#xff0c;然后SDL将YUV显示到电脑屏幕上…