设置玩家的初始化位置
目前玩家都是在相同的初始位置被创建。游戏一开始,除非我们先挪动一个玩家,不然它们会处在同样的位置不容易辨识。所以理想状态下,玩家应该在不同的位置被派生。
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,退出运行模式。