UrhoSharp简介

这篇文章简要介绍UrhoSharp重要概念

UrhoSharpXamarin.NET开发人员的强大3D游戏引擎。它与AppleSceneKitSpriteKit类似,包括物理,导航,网络等等,同时仍然是跨平台。

它是一个.NET绑定到Urho3D引擎,允许开发人员编写跨平台代码,可以使用相同的代码库来定位AndroidiOSWindowsMac,并可以渲染到OpenGLDirect3D系统。

UrhoSharp是一款具有开箱即用功能的游戏引擎。

·        强大的3D图形渲染

  •  物理模拟(使用Bullet库)
  •   场景处理
  • ·        等待/异步支持
  •  友好操作API
  •  2D融入3D场景
  •  使用FreeType字体渲染
  •   客户端和服务器网络功能
  •  导入广泛的资产(使用开放资产库)
  • 导航网格和寻路(使用Recast / Detour
  • 用于碰撞检测的凸体船身(使用StanHull
  • 音频播放(使用libvorbis

入门

UrhoSharp方便地作为NuGet软件包分发,可以添加到您的目标WindowsMacAndroidiOSC#或F#项目。NuGet带有运行程序所需的库,以及引擎使用的基本资产(CoreData)。

Urho作为Portable Class Library

Urho包可以从特定于平台的项目或从PortableClass Library项目中使用,从而允许您在所有平台上重用所有代码。这就意味着你每个平台上必须做的就是编写平台特定的入口点,然后将控件转移到你的共享游戏代码。

Sample

您可以通过在Xamarin StudioVisualStudio中打开Sample解决方案来获得Urho的功能:

https://github.com/xamarin/urho-samples

默认解决方案包含适用于AndroidiOSWindowsMac的项目。我们已经构建了这样的解决方案,以便我们有一个特定的平台启动器,所有的示例代码和游戏代码都存在于一个便携式的类库中,说明了如何最大程度地在所有平台上重用代码。

有关如何创建自己的解决方案的更多信息,请参阅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();

运行时将为您调用SetupStart方法。如果您重写,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文档中更深入探讨如何使用代码来构建一个游戏。

你可能感兴趣的:(UrhoSharp简介)