Unity多人联网游戏Multiplayer Networking-派生与复位

设置玩家的初始化位置

目前玩家都是在相同的初始位置被创建。游戏一开始,除非我们先挪动一个玩家,不然它们会处在同样的位置不容易辨识。所以理想状态下,玩家应该在不同的位置被派生。

NetworkStartPosition组件可以用来实现这项功能,因为它内置特性处理派生位置。为了创建独特的派生位置,我们需要创建两个新的游戏物体,每个都有NetworkStartPosition组件。

Ÿ 创建一个新的空物体,重命名为“Spawn Position 1”。

Ÿ 选中SpawnPosition 1,添加组件Network > NetworkStartPosition。

Ÿ 设置Transform Position为(3, 0, 0)。

Ÿ 复制SpawnPosition 1,重命名为“Spawn Position 2”。

Ÿ 选中SpawnPosition 2,设置Transform Position为(-3, 0, 0)。

Ÿ 选中Hierarchy窗口中的Network Manager。

Ÿ 打开Spawn Info折页。

Ÿ 将Player Spawn Method改为 Round Robin。

因为Spawn Position有NetworkStartPosition组件,所以NetworkManager会自动找到它。

然后NetworkManager会用这些物体的Transform Position以及NetworkStartPosition来派生新的游戏物体。

有两个玩家派生的方法:Random和Round Robin。

Random会用 NetworkSpawnPositions中的一个随机派生点,Round Robin会循环使用派生点。

测试:

Ÿ 选择standalone application,创建单机项目并运行。

Ÿ 点击LAN Host按钮,使单机项目上的实例成为主机。

这个时候,第一个player与4个enemy被创建。

Ÿ 移动游戏物体。

Ÿ 返回Unity,进入运行模式。

Ÿ 点击Unity场景中的LANClient按钮,作为客户端来连接主机。

现在游戏开始时会在不同的地点创建玩家物体。

Ÿ 关闭单机版。

Ÿ 返回Unity,退出运行模式。

设置复活位置

案例的最后一步是用Spawn Position物体上的NetworkStartPosition组件创建一个简易系统,来创建玩家再生的序列位置。这个步骤并不是必须的,只是为了让实例更加完整。

值得注意的是存储再生位置的更简单的方法是在Start函数中存储本地玩家的位置,这样的话Network Manager上的Round Robin Player Spawn Method的start position在某种性质上属于玩家。

我们需要创建一个序列,找到有NetworkStartPosition附属的所有游戏物体,将它们加入到序列中并用它们的Transform Position作为一个再生点。这和Network Manager中设置初始位置很类似,但是是以一种更简单的方式,我们没有用Round Robin,只是用了Random。

Ÿ 打开Health脚本。

Ÿ 添加NetworkStartPosition类型新的数组,来存储派生点。

privateNetworkStartPosition[] spawnPoints;

Ÿ 添加Start函数。

Ÿ 在Start函数中增加游戏物体是否LocalPlayer的判断。

  void Start ()


 {

   if (isLocalPlayer)

  {

  spawnPoints = FindObjectsOfType();

 }
 }
    

          Unity官网多人联网游戏入门教程译文(Multiplayer Networking) 九

转载2016-09-06 20:34:47
标签:networkunity教程网络
17.派生与复位
设置玩家的初始化位置

目前玩家都是在相同的初始位置被创建。游戏一开始,除非我们先挪动一个玩家,不然它们会处在同样的位置不容易辨识。所以理想状态下,玩家应该在不同的位置被派生。

NetworkStartPosition组件可以用来实现这项功能,因为它内置特性处理派生位置。为了创建独特的派生位置,我们需要创建两个新的游戏物体,每个都有NetworkStartPosition组件。

Ÿ 创建一个新的空物体,重命名为“Spawn Position 1”。

Ÿ 选中SpawnPosition 1,添加组件Network > NetworkStartPosition。

Ÿ 设置Transform Position为(3, 0, 0)。

Ÿ 复制SpawnPosition 1,重命名为“Spawn Position 2”。

Ÿ 选中SpawnPosition 2,设置Transform Position为(-3, 0, 0)。

Ÿ 选中Hierarchy窗口中的Network Manager。

Ÿ 打开Spawn Info折页。

Ÿ 将Player Spawn Method改为 Round Robin。

因为Spawn Position有NetworkStartPosition组件,所以NetworkManager会自动找到它。

然后NetworkManager会用这些物体的Transform Position以及NetworkStartPosition来派生新的游戏物体。

有两个玩家派生的方法:Random和Round Robin。

Random会用 NetworkSpawnPositions中的一个随机派生点,Round Robin会循环使用派生点。

测试:

Ÿ 选择standalone application,创建单机项目并运行。

Ÿ 点击LAN Host按钮,使单机项目上的实例成为主机。

这个时候,第一个player与4个enemy被创建。

Ÿ 移动游戏物体。

Ÿ 返回Unity,进入运行模式。

Ÿ 点击Unity场景中的LANClient按钮,作为客户端来连接主机。

现在游戏开始时会在不同的地点创建玩家物体。

Ÿ 关闭单机版。

Ÿ 返回Unity,退出运行模式。

设置复活位置

案例的最后一步是用Spawn Position物体上的NetworkStartPosition组件创建一个简易系统,来创建玩家再生的序列位置。这个步骤并不是必须的,只是为了让实例更加完整。

值得注意的是存储再生位置的更简单的方法是在Start函数中存储本地玩家的位置,这样的话Network Manager上的Round Robin Player Spawn Method的start position在某种性质上属于玩家。

我们需要创建一个序列,找到有NetworkStartPosition附属的所有游戏物体,将它们加入到序列中并用它们的Transform Position作为一个再生点。这和Network Manager中设置初始位置很类似,但是是以一种更简单的方式,我们没有用Round Robin,只是用了Random。

Ÿ 打开Health脚本。

Ÿ 添加NetworkStartPosition类型新的数组,来存储派生点。

privateNetworkStartPosition[] spawnPoints;

Ÿ 添加Start函数。

Ÿ 在Start函数中增加游戏物体是否LocalPlayer的判断。

        void Start ()

         {

      if (isLocalPlayer)

{

  spawnPoints = FindObjectsOfType();

}

 }

Ÿ 添加逻辑找到有NetworkStartPosition组件的所有实例,并且将它们存储到 Spawn Point序列里面。

spawnPoints =FindObjectsOfType();

注意这里用的是复数:FindObjectsOfType。

Ÿ 在RpcRespawn函数isLocalPlayer的判断里,删除现有程序。

// Set the player’sposition to origin

transform.position =Vector3.zero;

Ÿ 在RpcRespawn函数isLocalPlayer的判断里,更新代码,用spawn points序列中的一个随机位置。

 // Set the spawnpoint to origin as a default value

 Vector3 spawnPoint =Vector3.zero;

   // If there is aspawn point array and the array is not empty, pick one at random

   if (spawnPoints !=null && spawnPoints.Length > 0)

   {

   spawnPoint =spawnPoints[Random.Range(0, spawnPoints.Length)].transform.position;

}

/ Set the player’sposition to the chosen spawn point

transform.position =spawnPoint;

最终代码:

 using UnityEngine;

 using UnityEngine.UI;

 usingUnityEngine.Networking;

usingSystem.Collections;

public class Health :NetworkBehaviour {

public const int maxHealth = 100;

public bool destroyOnDeath;

[SyncVar(hook ="OnChangeHealth")]

public int currentHealth = maxHealth;

public RectTransform healthBar;

private NetworkStartPosition[] spawnPoints;

void Start ()

{

    if (isLocalPlayer)

    {

        spawnPoints =FindObjectsOfType();

    }

}

public void TakeDamage(int amount)

{

    if (!isServer)

        return;

    currentHealth -= amount;

    if (currentHealth <= 0)

    {

        if (destroyOnDeath)

        {

            Destroy(gameObject);

        }

        else

        {

            currentHealth = maxHealth;

            // called on the Server,invoked on the Clients

            RpcRespawn();

        }

    }

}

void OnChangeHealth (int currentHealth )

{

    healthBar.sizeDelta = newVector2(currentHealth , healthBar.sizeDelta.y);

}

[ClientRpc]

void RpcRespawn()

{

    if (isLocalPlayer)

    {

        // Set the spawn point to origin asa default value

        Vector3 spawnPoint = Vector3.zero;



        // If there is a spawn point arrayand the array is not empty, pick one at random

        if (spawnPoints != null &&spawnPoints.Length > 0)

        {

 spawnPoint =spawnPoints[Random.Range(0, spawnPoints.Length)].transform.position;

        }

        // Set the player’s position to thechosen spawn point

        transform.position = spawnPoint;

    }

}

}

Ÿ 保存脚本,返回Unity。

Ÿ 选择standalone application,创建单机项目并运行。

Ÿ 点击LAN Host按钮,使单机项目上的实例成为主机。

这个时候,第一个player与4个enemy被创建。

Ÿ 移动游戏物体。

Ÿ 返回Unity,进入运行模式。

Ÿ 点击Unity场景中的LANClient按钮,作为客户端来连接主机。

现在游戏开始时会在不同的地点创建玩家物体,玩家生命值降为0时,会随机在已有的一个派生位置上复活。

Ÿ 关闭单机版。

Ÿ 返回Unity,退出运行模式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值