首页 > 其他分享 >unity之network客户端向服务器发送消息【Command】方法详解

unity之network客户端向服务器发送消息【Command】方法详解

时间:2023-01-05 13:39:35浏览次数:44  
标签:network scores unity Command 右键 服务器发送 服务器 客户端


如果是纯粹是聊天室功能则可以使用NetworkView的方法来进行,简单实用。

如果不是聊天室功能而是要传递数据给服务器,同时为了以后更多功能的拓展性,还是应该用network manager来实现。

无论是哪种方式,unet里的的一个特点就是:服务器端是会包括客户端的。换言之客户端和服务器是在同一个场景里开发的。。。此处的包括二字何解?就是服务器端会自动生成一个player(之前很多文章都在讲unet的player与服务器同步的问题,那是入门级别的东西,多看看就知道是怎么回事)。这个player身上具备的属性就是客户端的玩家具备的属性。当然这个player只是代指客户端而已。实际可以理解为在networkmanager里自动生成一个客户端。

如果是做局域网的传输,在networkmanager里一定要注意不要勾选use websockets这一项。

unity之network客户端向服务器发送消息【Command】方法详解_服务器

本文案例为局域网,需求是客户端进行考核之后,客户端的系统逻辑会判断出分数,然后将分数传给服务器。而此处只说如何从客户端把分数传给服务器这一功能。

开始搞起:

新建一个场景,内容network(空物体)、client(红色的cube)、UI的Text显示文本(需要把客户端传来的值显示出来)。

unity之network客户端向服务器发送消息【Command】方法详解_服务器_02

然后在network物体上添加上networkmananger组件和managerHUD组件。不需要其他的另外的脚本了。

unity之network客户端向服务器发送消息【Command】方法详解_服务器_03

client这个物体添加network identity,和我写的Clientmanager脚本

unity之network客户端向服务器发送消息【Command】方法详解_客户端_04

然后看Clientmanager脚本的具体内容,如下:

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

public class clientmanager : NetworkBehaviour
{
private Text GetTexts;

//[SyncVar]/// 用来标记同步成员变量,可以是任何基本数据类型,但不能是类、列表或其他集合
private int scores = 95;
// Use this for initialization
void Start()
{
GetTexts = GameObject.Find("Canvas").gameObject.transform.FindChild("Text").gameObject.GetComponent<Text>();
}

// Update is called once per frame
void Update()
{
if (isLocalPlayer)
{
if (Input.GetMouseButtonDown(1))
{
Debug.Log("点击右键发送");
//为了测试每次点击让分数+2
scores += 2;
CmdSendMessage(scores);
}
}

}


///加了Command之后,该方法必须Cmd开头,方法虽然写在客户端的脚本里,但是是在服务器执行的,所以执行的效果也是只有服务器能看到。

[Command]
void CmdSendMessage(int i)
{
GetTexts.text += i.ToString() + "在服务器端执行\n";
}
}

 

这样打包来进行测试,打开两个,一个作为服务器,另一个打开的作为客户端。

当鼠标右键点击客户端的时候会看到,在服务器的Text显示列表中会不断的打印出东西,说明完成了客户端的数据上穿到服务器功能:

unity之network客户端向服务器发送消息【Command】方法详解_服务器_05

至此功能已经完成了。。。下面的文字用来解释原理。

 


然后说说原理吧,可以看到,服务端我们没有绑定自己写的任何脚本,同步功能用了系统 的networkmanager,在初始化的时候就会自动生成了客户端,UI用的是系统自带的network namager HUD来实现的,所以重点是在客户端了。

客户端的代码也非常简单,在Update里面确定了是isLocalPlayer也就是说只有本地客户端的时候就可以进行右键点击,当右键点击的时候就会给初始化的scores = 95这值加2,然后调用了CmdSendMessage(scores);这个方法,把分数的值作为参数传递。

重点说说[Command]这个玩意,虽然之前的文章中说过它的功能但此处还是再详细讲解下。如下述:

CmdSendMessage();这个方法是被 [Command]标记过的,所以是会在服务器端执行的,不会再本地执行。如果取消了[Command]的标志那就肯定只在本地执行了也就是完全的本地的方法啊和服务端没关系。。。所以如果没有[Command]的标志,上图中的那些值就会在本客户端显示出来而不会显示在服务器。

所以最后的总结就是:如果要从客户端把数据传到服务器,脚本绑定到客户端,并且需要在对应的方法前加上 [Command],这样这个方法虽然写在客户端但是实际运行会在服务端,运行的效果也只会呈现在服务端而不是客户端。

标签:network,scores,unity,Command,右键,服务器发送,服务器,客户端
From: https://blog.51cto.com/u_8378185/5990799

相关文章

  • Unity之NetworkView聊天室功能
    NetworkView是Unity封装的一套快速实现多人联机游戏的功能。以此为基础,我们可以开发各种类型的多人游戏,可以开发过关游戏的双人联机,也可以开发类似于CS的射击游戏,以房间为单......
  • unity之粒子碰撞触发方法
    需求是用水灭掉火焰。所以水的粒子要与火焰的粒子发生碰撞时执行灭火事件。效果如图: 首先从火焰角度思考:火焰的粒子要监测是否被撞到,所以要给它加上碰撞体。同时勾选collis......
  • Unity制作聊天室功能
    用untiy作客户端、用VS的控制台程序来做服务器。首先是服务器端的代码,分两个类一个Program,一个ForClient类。分别如下:usingSystem.Net.Sockets;usingSystem.Collections.......
  • unity的UI Event事件(Event Trigger和EventSystem对比)
    首先看Unity中UIEvent事件介绍上图中出现的组件在场景里都是unity里的事件相关的组件。例如:场景里EventSystem里默认就有Standaloneinputmodule这个组件(当然也可以随便加......
  • Unity3D之数据持久化储存
        首先我们来看两段Unity3D中实现数据读写的简单代码吧://保存数据PlayerPrefs.SetString("Name",mName);PlayerPrefs.SetInt("Age",mAge);PlayerPref......
  • Unity计时器功能
    在程序开发中很多地方会用到计时器进行倒计时的功能。下面我就写一个非常实用的倒计时功能。首先在场景中建一个Text用来显示倒计时的数值,然后给它加上倒计时的脚本Timer。......
  • Unity3D常用函数说明
    Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结。 Awake当前控......
  • Unity跳转场景报空指针解决
    当跳转场景时,有时候会出现空指针问题。解决办法:将即将跳转到的scene添加到BuildSettings里面。举个例子:例如从某个场景要跳转到network这个场景中,那么BuildSettings里面必......
  • Unity利用协同实现场景异步加载
    1.usingUnityEngine;2.usingSystem.Collections;3.4.publicclassFightTriggle:MonoBehaviour{5.privateAsyncOperationasync;6.i=0;7.......
  • Unity3D中Resources动态加载NGUI图片
    在NGUI中有些图片我需要动态进行变更或者加载,怎么办?首先在项目中创建一个Resources目录,接着把需要的图片放在这里面,可以有子文件夹么?当然可以,文件结构很重要哦~NGUI加载图片......