这篇文章简要介绍UrhoSharp重要概念
UrhoSharp是Xamarin和.NET开发人员的强大3D游戏引擎。它与Apple的SceneKit和SpriteKit类似,包括物理,导航,网络等等,同时仍然是跨平台。
它是一个.NET绑定到Urho3D引擎,允许开发人员编写跨平台代码,可以使用相同的代码库来定位Android,iOS,Windows和Mac,并可以渲染到OpenGL和Direct3D系统。
UrhoSharp是一款具有开箱即用功能的游戏引擎。
· 强大的3D图形渲染
UrhoSharp方便地作为NuGet软件包分发,可以添加到您的目标Windows,Mac,Android或iOS的C#或F#项目。NuGet带有运行程序所需的库,以及引擎使用的基本资产(CoreData)。
Urho包可以从特定于平台的项目或从PortableClass Library项目中使用,从而允许您在所有平台上重用所有代码。这就意味着你每个平台上必须做的就是编写平台特定的入口点,然后将控件转移到你的共享游戏代码。
您可以通过在Xamarin Studio或VisualStudio中打开Sample解决方案来获得Urho的功能:
https://github.com/xamarin/urho-samples
默认解决方案包含适用于Android,iOS,Windows和Mac的项目。我们已经构建了这样的解决方案,以便我们有一个特定的平台启动器,所有的示例代码和游戏代码都存在于一个便携式的类库中,说明了如何最大程度地在所有平台上重用代码。
有关如何创建自己的解决方案的更多信息,请参阅Urho和您的平台页面。
由于所有样本共享一组常用的用户界面元素,所以样本已经抽象出了该文件中的基本设置:
https://github.com/xamarin/urho-samples/blob/master/FeatureSamples/Core/Sample.cs
这提供了一个Sample Base,它可以处理一些基本的按键和触摸事件,设置一个摄像头,提供基本的用户界面元素,并且这样可以让每个样本集中在正在展示的特定功能上。
以下示例显示了引擎能够做什么:
· Samply游戏一个简单的克隆的ShootySkies。
而其他样品显示每个样品的个体性质。
你的游戏应该是亚 Application
类,这就是您将在哪里设置游戏(在Setup
方法中)并开始游戏(在Start
方法中)。然后构建您的主用户界面。我们将通过一个小样本,显示API来设置3D场景,一些UI元素并附加一个简单的行为。
classMySample : Application {
protectedoverridevoidStart ()
{
CreateScene ();
Input.KeyDown+= (args) => {
if (args.Key==Key.Esc) Exit ();
};
}
async voidCreateScene()
{
// UI text
var helloText =newText()
{
Value="Hello World from MySample",
HorizontalAlignment=HorizontalAlignment.Center,
VerticalAlignment=VerticalAlignment.Center
};
helloText.SetColor(newColor(0f, 1f, 1f));
helloText.SetFont(
font: ResourceCache.GetFont("Fonts/Font.ttf"),
size: 30);
UI.Root.AddChild(helloText);
// Create a top-level scene, must add the Octree
// to visualize any 3D content.
var scene =newScene();
scene.CreateComponent<Octree>();
// Box
Node boxNode = scene.CreateChild();
boxNode.Position=newVector3(0, 0, 5);
boxNode.Rotation=newQuaternion(60, 0, 30);
boxNode.SetScale(0f);
StaticModel modelObject = boxNode.CreateComponent<StaticModel>();
modelObject.Model=ResourceCache.GetModel("Models/Box.mdl");
// Light
Node lightNode = scene.CreateChild(name: "light");
lightNode.SetDirection(newVector3(0.6f, -1.0f, 0.8f));
lightNode.CreateComponent<Light>();
// Camera
Node cameraNode = scene.CreateChild(name: "camera");
Camera camera = cameraNode.CreateComponent<Camera>();
// Viewport
Renderer.SetViewport(0, newViewport(scene, camera, null));
// Perform some actions
await boxNode.RunActionsAsync(
newEaseBounceOut(newScaleTo(duration: 1f, scale: 1)));
await boxNode.RunActionsAsync(
newRepeatForever(newRotateBy(duration: 1,
deltaAngleX: 90, deltaAngleY: 0, deltaAngleZ: 0)));
}
}
如果您运行此应用程序,您将很快发现运行时抱怨您的资产不存在。您需要做的是在项目中创建一个以特殊目录名“Data”开头的层次结构,并在其中将您引用的资产放在程序中。然后,您必须将“复制到输出目录”中的每个资产的项目属性设置为“复制(如果较新)”,这将确保您的数据在那里。
让我们来解释这里发生了什么。
要启动应用程序,请调用引擎初始化函数,然后创建一个新的Application类实例,如下所示:
newMySample().Run();
运行时将为您调用Setup
和Start
方法。如果您重写,Setup
您可以配置引擎参数(不在此示例中显示)。
你必须重写,Start
因为这将启动你的游戏。在此方法中,您将加载资源,连接事件处理程序,设置场景并启动所需的任何操作。在我们的示例中,我们都创建了一些UI来向用户显示以及设置3D场景。
以下代码使用UI框架创建一个文本元素并将其添加到您的应用程序中:
// UI text
var helloText =newText()
{
Value="Hello World from UrhoSharp",
HorizontalAlignment=HorizontalAlignment.Center,
VerticalAlignment=VerticalAlignment.Center
};
helloText.SetColor(newColor(0f, 1f, 1f));
helloText.SetFont(
font: ResourceCache.GetFont("Fonts/Font.ttf"),
size: 30);
UI.Root.AddChild(helloText);
UI框架是提供一个非常简单的游戏中的用户界面,它通过向节点添加新的节点来工作UI.Root
。
我们的示例的第二部分设置了主要场景。这涉及到许多步骤,创建一个3D场景,在屏幕上创建一个3D框,添加一个光,一个摄像头和一个视口。这些在“ 场景,节点,组件和相机 ” 一节中有更详细的探讨
我们的示例的第三部分触发了一些动作。操作是描述特定效果的配方,一旦创建,它们可以由一个节点按需执行,通过调用一个RunActionAsync
方法Node
。
第一个动作用弹跳效果缩放框,第二个旋转框永久旋转:
await boxNode.RunActionsAsync(
newEaseBounceOut(newScaleTo(duration: 1f, scale: 1)));
上面显示了我们创建的第一个动作是一个ScaleTo
动作,这只是一个表示你想要缩放一个节点的比例属性的值的配方。这个动作又是围绕一个放松的动作,EaseBounceOut
动作。缓解动作扭曲了一个动作的线性执行并应用了一个效果,在这种情况下它提供了弹跳效果。所以我们的食谱可以写成:
var recipe =newEaseBounceOut(newScaleTo(duration: 1f, scale: 1));
一旦配方被创建,我们执行配方:
await boxNode.RunActionsAsync (recipe)
await表示当操作完成后,该行将希望在此行之后恢复执行。一旦动作完成,我们触发第二个动画。
在使用UrhoSharp文档中更深入探讨如何使用代码来构建一个游戏。