入门指南
欢迎您,并很高兴知道您想学习DarkRift!本教程旨在成为一个全面的指南,为任何想要开始使用DarkRift的人提供帮助,无论您有多少网络经验。尽管如此,作为一个讨厌过度简化的人,我会尽力让对于有网络经验的人也感到有趣!
如果您想学习DarkRift,您需要对C#有扎实的掌握,并且对Unity有很好的了解。DarkRift还广泛使用多线程,因此,尽管我们在本教程中不会使用多线程,但要充分发挥DarkRift的优势,您需要非常了解多线程!
作为教程,我们将重新创建一个受欢迎的游戏,称为Agar.io。我们不会实现它的所有功能,但我们将开始一个基本的移动和吃东西的系统,您可以在练习后添加其他功能。
完成的Agar项目可在GitHub上的两个部分中获取:Unity项目和插件
安装
在本节中,我们将介绍如何下载和安装DarkRift。
创建一个新的Unity 2D项目,然后进入Unity资产商店,搜索DarkRift并单击下载。它会询问您要导入哪些部分,现在只要导入所有内容即可。
在项目的根文件夹中,现在会有一个名为DarkRift Server的zip文件,请将其解压到Unity项目之外的某个地方(例如您的桌面)。
注意:如果您将其解压缩到Unity项目中,Unity会抛出很多错误,因为项目中会有相同名称的库文件,所以不要这样做。
如果您还没有这样做,现在是查看DarkRift中包含的演示项目并了解如何使用服务器的好时机。
Unity场景
设置DarkRift
在一个空的Unity场景中添加一个空的GameObject,将其重命名为“Network”,然后添加一个DarkRift -> Client组件。
这是DarkRift的第一个基本部分,客户端脚本将为您连接到服务器,并允许您发送和接收消息 - 而且它甚至还为您内置了一些有用的工具!让我们看一下它的Unity界面。
- Address 是您要连接到的服务器所在的IP地址,默认情况下设置为本地主机(运行游戏的同一台计算机)用于开发。
- Port 是您设置的服务器监听的端口号,默认为4296。
- IP Version 是您要使用的IP地址类型,最可能是IPv4。
- Auto Connect 意味着当Unity调用Start方法时,客户端将尝试建立连接。如果关闭此选项,则需要从您的代码中手动调用UnityClient.Connect()。
- Invoke From Dispatcher 意味着客户端将从Unity的主线程中引发所有事件,因此您无需担心同步和多线程。如果禁用此选项,则需要自己处理同步和调度到主线程,但您应该能够看到性能提升。请参见Dispatcher。
- Sniff Data 意味着客户端将为了调试目的打印接收到的消息的详细信息
将所有内容保持不变。
Players
下载或制作一个带有透明背景的白色圆形,以便我们可以为不同的玩家着色,分辨率越高越好。我使用了这个大白色圆形。
创建一个名为AgarObject的C#脚本,并添加以下我们稍后将使用的辅助函数:
[RequireComponent(typeof(Renderer))]
public class AgarObject : MonoBehaviour
{
[SerializeField]
[Tooltip("The speed that the player will move.")]
float speed = 1f;
[SerializeField]
[Tooltip("Multiplier for the scaling of the player.")]
float scale = 1f;
Vector3 movePosition;
void Awake()
{
movePosition = transform.position;
}
void Update()
{
if (speed != 0f)
transform.position = Vector3.MoveTowards(transform.position, movePosition, speed * Time.deltaTime);
}
public void SetColor(Color32 color)
{
Renderer renderer = GetComponent<Renderer>();
renderer.material.color = color;
}
public void SetRadius(float radius)
{
transform.localScale = new Vector3(radius * scale, radius * scale, 1);
}
public void SetMovePosition(Vector3 newPosition)
{
movePosition = newPosition;
}
}
将此脚本添加到一个新的Sprite GameObject中,并将白色圆形精灵分配给SpriteRenderer的sprite字段。 将其设置为名为NetworkPlayer的预制件,然后创建一个名为MouseController的新C#脚本:
[RequireComponent(typeof(AgarObject))]
public class MouseController : MonoBehaviour
{
AgarObject agarObject;
void Awake()
{
agarObject = GetComponent<AgarObject>();
}
void Update ()
{
Vector3 mousePoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
mousePoint.z = 0;
agarObject.SetMovePosition(mousePoint);
}
}
将MouseController脚本添加到NetworkPlayer GameObject中,并将其设置为单独的预制件ControllablePlayer(为了清晰起见,现在应该有两个版本:不带MouseController的NetworkPlayer和带MouseController的ControllablePlayer)。您应该能够测试您的玩家并获得适合您的正确速度值的感觉。
确保NetworkPlayer的速度应该是ControllablePlayer的1.5倍。
ControllerPlayer
Food
下载或制作一个食物一样的白色正方形,以便我们可以给它不同的颜色。 由于它是正方形,透明背景可能不是必需的。 我使用了这个大白色正方形。
创建一个只包含正方形和AgarObject脚本的新预制件,将其速度设置为0,然后确保您的场景仅包含我们的Network对象和Main Camera。
Camera
最后,在我们开始网络设置之前,创建一个包含以下内容的CameraFollow脚本:
public class CameraFollow : MonoBehaviour
{
[SerializeField]
public float speed = 5f;
public Transform Target { get; set; }
void Update ()
{
if (Target != null)
{
Vector3 targetPos = Target.GetComponent<Renderer>().bounds.center;
transform.position = Vector3.Lerp(
transform.position,
new Vector3(targetPos.x, targetPos.y, transform.position.z),
speed * Time.deltaTime
);
}
}
}
将CameraFollow脚本添加到Main Camera中,以便稍后使用它,并将相机的背景颜色设置为白色。
因为我们正在制作一个2D游戏,请确保您的Scene View处于2D模式,并使相机正交。
现在是保存这个场景 这是我们现在要做的所有客户端逻辑!