Unity3D UNET 模仿局域网游戏

这两天在学习的过程中,发现一个讲Unity的unet组件的好教程,在这里分享给大家。

新建一个 UnetProject。

新建一个GameObject重命名为Network Manager,给它添加Network Manager组件,这是Unet提供的一个核心管理组件,可以在脚本里访问Network Manager进行网络开发。

还需要添加一个 Network Manager HUD 组件,这个用来显示UI,UI上的按钮会跟Network Manager交互。这时候运行屏幕上会出现如下:

LAN Host(H):把本机作为Server + Client,即服务端加客户端

LAN Client(C):与服务器连接,后面填ip地址(localhost就是本机)

LAN Server Only(S):本机只作为服务端

一般在测试时才会用这个组件。

现在用unity自带的模型拼装一个Player出来(随便就行),给他添加Network Identity 组件,这是一个网络标识符,拥有标识符的物体可以在网络上生成,也就是同步到其他客户端。

标注的地方:Server Only:只会在服务器端时才有权限对他进行操作

Local Player Authority: 会在客户端时有权限,是一个局部角色

我们给Player选中Local Player Authority,表示运行时连接上服务端我们也可以对他进行操作。

为了让他能在局域网生成,

这表示我们要生成的角色是哪个,这样在每次联机时Network Manager会自动根据Player Prefab 创建一个角色。

Auto Create Player : 每次服务器,客户端连接都会创建一个Player

现在运行看见的效果不明显,我们先把控制角色做了,在运行,效果明显。

新建PlayerController脚本并编辑:

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

//为了能让脚本在连上局域网的同时还能分别控制物体,所以要继承 NetworkBehaviour
public class PlayerController : NetworkBehaviour {
    public float traSpeed = 3;  //移动的速度
    public float rotSpeed = 120;  //一秒旋转的角度

    // Update is called once per frame
    void Update () {

        // isLocalPlayer 是 NetworkBehaviour 的内置属性
        if (!isLocalPlayer)    //如果不是本地客户端,就返回,不执行下面的操作
        {
            return;
        }
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        transform.Translate(Vector3.forward * v * traSpeed * Time.deltaTime);   //朝某个方向移动
        transform.Rotate(Vector3.up * h * rotSpeed * Time.deltaTime);  //围绕某轴旋转
    }
}

这里还需要给Player添加一个Network Transform组件才行,这是一个同步Transform的组件,包括:position、rotation、scale。它的同步是单向的,就是将你控制的物体同步到其他客户端,当你在服务端改变该物体时,客户端不会跟着改变。

按Ctrl+B打包工程,选好路径后,以后按Ctrl+B会自动打包,现在把打包后的程序和unity都运行起来,毕竟是联机,肯定要有两个才能看出效果,我默认是unity作为服务端+客户端,打包后的程序作为单纯的客户端。下面是效果图:

这里运行是没有问题的。但是两个角色看起来一样,无法区分,现在来区分一下。编辑脚本:

    //这是重写 NetworkBehaviour 内的方法
    //这个方法只会在创建本地角色时调用
    public override void OnStartLocalPlayer()
    {
        GetComponent<MeshRenderer>().material.color = Color.blue;
    }

添加以上代码,然后运行,

这是我们发现只有自己控制的那个才是蓝色,另外一个还是默认的白色,这样我们就可以区分角色了。

现在我们给角色添加上枪和子弹,让他可以射击。还要给子弹添加上Rigidbody组件,取消重力。把枪的碰撞器去掉,它不需要做检测。

如图,这只是效果图。。我给角色添加了一个Gun作为枪,在枪前面添加一个空物体作为生成子弹的地方。。编辑脚本:

    //类下添加
    public GameObject bulletPre;   //子弹的prefab
    public Transform bulletTrans;  //生成子弹的位置
    //update方法中添加
    if (Input.GetKeyDown(KeyCode.Space))
        {
            Fire();
        }
   //添加一个方法
     void Fire ()
    {
        GameObject bullet = Instantiate(bulletPre, bulletTrans.position, Quaternion.identity) as GameObject;
        bullet.GetComponent<Rigidbody>().velocity = transform.forward * 10;
        Destroy(bullet, 2);   //2秒后销毁子弹
    }

现在子弹也能射击了,只不过不同步,现在我们让他同步。联机游戏会把所有的功能处理都放到Server上处理,例如敌人的生成,游戏逻辑的判断,所以这里的子弹我们也让他在Server上生成,然后同步到客户端。给子弹添加Network Identity组件,然后修改Network Manager

修改 PlayerController脚本:

[Command]    //在客户端调用,但是在服务端运行,这是方法必须以 Cmd 开头
    void CmdFire()
    {
        GameObject bullet = Instantiate(bulletPre, bulletTrans.position, Quaternion.identity) as GameObject;
        bullet.GetComponent<Rigidbody>().velocity = transform.forward * 10;
        Destroy(bullet, 2);   //2秒后销毁子弹

        NetworkServer.Spawn(bullet);    //在所有客户端都生成一个物体
    }

注意:调用的哪里也改成CmdFire。。在给子弹添加Network Transform组件,Transform Sync Mod对应Sync Rigidbody 3D,这是同步刚体组件,Network Send Rate 改为0,表示只同步一次,就是添加速度就行了。

好了现在已经可以连上局域网,单独控制并且发射子弹了,还有的内容我将会在接下来的博客中进行讲解。

本博客用作新手学习讨论,如有不好或错误的地方也请指出来,谢谢。

时间: 2024-10-10 01:19:08

Unity3D UNET 模仿局域网游戏的相关文章

Unity3D UNET 模仿局域网游戏(二)

紧接着上一篇博客,上一篇博客中,我们已经能够分别移动角色,并且控制他射击了,而且还稍微区分了一下不同的角色.这篇博客中我们继续讲解后面的内容. 既然角色都已经可以射击了,那肯定还得需要一个血量对吧,所以现在我们就添加血量.给Player添加Health脚本并编辑: using UnityEngine; using System.Collections; public class Health : MonoBehaviour { public const int maxHealth = 100;

Unity3D射击游戏-UNITY3D软件开发、游戏开发、UNITY3D游戏开发

Unity3D射击游戏-UNITY3D软件开发.游戏开发.UNITY3D游戏开发 上海诸君信息科技有限公司是以Oculus.Unity.虚拟现实作为核心业务的民营高科技企业,坚持精益研发与技术创新,拥有丰富Oculus.Unity.虚拟现实的软件与游戏开发经验,能提供优质的技术解决方案. 公司拥有全面强大的团队,拥有优秀的设计师与美术人员,有大量的游戏项目制作管理经验,能优质控制游戏产品质量和制作时间,成功服务于海内外多家公司,拥有丰富的客户案例. 诸君信息科技已服务的客户包括,普华永道.交大.

[Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛

大家好,我是秦培.欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 在前面的文章中.我们分别实现了一个自己定义的角色控制器<[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果>和角色死亡的效果<[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色死亡效果实现>.今天我们继续来做点和仙剑相关的东西,首先我们来看一副图: 这幅图呢,是仙剑奇侠传的第一个迷宫场景--仙灵岛的莲花池. 男主角李逍遥为替婶婶求药独闯仙灵岛,在经历了前面的小

【Unity3d】3d网页游戏场景打包与加载

http://www.cnblogs.com/dosomething/archive/2012/04/07/2436353.html 3d游戏中  一个场景往往比较大  如果游戏的进行需要下载一个10M甚至更大的场景时  加载所用的时间会导致很大部分玩家的流失 我们知道unity3d中的内置地形是使用一张高度图  加载场景时  首先加载地形并显示  再去加载场景中的部件(比如树.房子等)  将会很有必要 在加载场景中的部件时  可以根据玩家当前所在的位置  由近到远的去加载 场景中的每个部件实际

unity3D引擎:2D游戏自动瞄准算法实现

转:http://blog.csdn.net/naitu/article/details/39555373 在很多飞行射击类游戏里,都有敌人向玩家自动瞄准并开火的功能.在这里本人用unity3D引擎新版本的2D系统来实现这个功能. 首先,让我们了解一下原理的理论知识.我们可以把敌人和玩家放到一个坐标系中,敌人是坐标是的原点((0,0)点),玩家是在这个坐标系中的一点.然后把二者在坐标系中构建成直角三角形来计算坐标系的X轴旋转多少角度指向玩家. 现在假设玩家分别放在坐标系的四个象限中,假设第一象限

【转】 各种 基于Unity3d 引擎的Android游戏优化 (drawcall)

1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他们都兼容ETC格式, 2. 对于透明贴图,我们只能选择RGBA 16bit 或者RGBA 32bit. 3. 减少FPS,在ProjectSetting-> Quality中的VSync Count 参数会影响你的FPS,EveryVBlank相当于FPS=60,EverySecondVBlank = 30: 这两种情况都不符合游戏的FPS的话,我们需要手动调整FP

u3d局域网游戏网络(c# socket select 模型)

之前写了一篇. 发完之后第二天实际应用到游戏之后还是发现了一些小毛病. 比如网络模块有重复使用(多对象)的情况.所以将静态类该成了普通类. 比如安卓下会有些异常出现导致游戏逻辑不正常.所以网络相关的函数有些加了try块. 然后发现写入固定ip的方式根本不适合局域网.于是加了udp做的广播系统,用以服务器和客户端查找ip. udp广播部分和tcp不一样.因为没有连接,所以socket不需要shutdown.我在这里吃了一亏才知道. 别的没什么修改.贴上修正和扩展之后的代码. 有缘之人自取.唯一要求

使用Unity3D制作一个转盘游戏

今天我们来做点和游戏无关的事情吧!因为博主在找工作的过程中遇到些挫折,所以难免会有些失落,因此实在心情和精力再去完成新的游戏案例,希望大家能够谅解啊.博主今天想和大家分享的是一个叫做幸运转盘的案例.我们知道平时在节假日商场为了促销商品,通常都会推出诸如转盘抽奖这样的游戏.在学了概率以后,虽然我们都知道中奖是一个小概率事件,可是人们对买彩票中奖这样的事情仍然乐此不疲.就像腾讯通过今年的春晚成功地为微信支付培养了大量忠实用户一样,虽然大家抢红包抢到的钱都不算多,可是大家都还是愿意去抢红包啊.为什么呢

开源unity3d、cocos2dx分布式游戏服务端引擎

一款开源的支持多人同时在线实时游戏的服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能够快速与 (Unity3D.OGRE.Cocos2d.HTML5,等等)技术结合形成一个完整的客户端. 服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术,将精力真正集中到游戏开 发层面上来,快速的打造各种网络游戏. Homepage http://www.kbengine.org Releases so