【零基础教学】Unet局域网联机的实现——最基础的Unity联网实现方式(3)

第三部分——敌人的实现


  • 学习前说明:

项目源码:链接:https://pan.baidu.com/s/1g78L9QODXdRjoVcm-odRSg 密码:0pzo

源码引用自Siki老师的Unet基础系列教程,文章主要以解释为主,后期会添加一些Siki老师源码以外的新东西,敬请期待。

文中用红色显示的内容为我自己命名的关键名词,例如场景名、代码名、阐述代码或方法所实现的功能 等等

文中用蓝色显示的内容为UI元素、组件名或是变量名,例如Button、InputField、NetworkManager 等等

文中用紫色显示的内容为当前所解释的代码部分。例如:

            这里使用一个Console命令完成输出语句

public void ShowMessage()

{

     Console.WriteLine("Hello World.");

}

本文中仅讨论Unet用于局域网的情况

如有互联网联网需求,请自行查询Unity与Socket协议结合相关的文章,不推荐使用Unet完成

本文主要服务于渤海大学交互式虚拟现实开发基地,为求尽可能的细致和易懂,可能有些地方写的过于冗杂,不喜勿喷


  • 需求分析

1.进入服务器时,服务器能够随机生成多个敌人

2.敌人由服务器控制,而不是客户端控制

3.敌人会随机生成在不同的位置,而不是固定于某一处。


  • 实例分析

创建角色

创建Enemy的方法与创建Player方法类似。但是为了有所区分,同时也避免增加算法上的复杂性。我们移除掉Player身上的枪,使他只能挨打,不能自动开枪,同时在他的头上加上一个炫酷的新发型。并将它保存为Prefab

Prefab上移除掉Enemy身上的PlayerController代码

          =====>               

创建EnemySpawner

新建一个空物体EnemySpawner,并添加同名脚本EnemySpawner

以下为代码

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

public class EnemySpawner : NetworkBehaviour {

    public GameObject enemyPrefab;
    public int numberOfEnemies;


    public override void OnStartServer()
    {
        for (int i = 0; i < numberOfEnemies; i++)
        {
            Vector3 position = new Vector3(Random.Range(-6f, 6f), 0, Random.Range(-6f, 6f));

            Quaternion rotation = Quaternion.Euler(0, Random.Range(0, 360), 0);

            GameObject enemy = Instantiate(enemyPrefab, position, rotation) as GameObject;

            NetworkServer.Spawn(enemy);
        }  
    }
	

}

分步解析

  • OnStartServer() 当服务端第一次启用时将被触发,与OnStartLocalClient()类似,只是它针对的是客户端

 public override void OnStartServer()
    {
      //function
    }

  • 随机位置的实现

public override void OnStartServer()
    {
        for (int i = 0; i < numberOfEnemies; i++)
        {
            Vector3 position = new Vector3(Random.Range(-6f, 6f), 0, Random.Range(-6f, 6f));

            Quaternion rotation = Quaternion.Euler(0, Random.Range(0, 360), 0);

            GameObject enemy = Instantiate(enemyPrefab, position, rotation) as GameObject;
        }  
    }

  • 同步到所有客户端

public override void OnStartServer()
    {
        for (int i = 0; i < numberOfEnemies; i++)
        {
            Vector3 position = new Vector3(Random.Range(-6f, 6f), 0, Random.Range(-6f, 6f));

            Quaternion rotation = Quaternion.Euler(0, Random.Range(0, 360), 0);

            GameObject enemy = Instantiate(enemyPrefab, position, rotation) as GameObject;

            NetworkServer.Spawn(enemy);
        }  
    }

  • 最后将Network IdentityServer Only属性勾上


就这样吧,掰掰。

猜你喜欢

转载自blog.csdn.net/qq_35004993/article/details/82222334