Xamarin.iOS'ta iOS Oyun API'leri
Bu makale, iOS 9 tarafından sağlanan ve Xamarin.iOS oyunlarının grafik ve ses özelliklerini geliştirmek için kullanılmaktadır.
Apple, bir Xamarin.iOS uygulamasında oyun grafiklerini ve seslerini uygulamayı kolaylaştıran iOS 9'daki oyun API'leri için çeşitli teknolojik geliştirmeler yaptı. Bunlar arasında hem üst düzey çerçeveler aracılığıyla geliştirme kolaylığı hem de gelişmiş hız ve grafik becerileri için iOS cihazın GPU gücü kullanılabilir.
Bu, Metal, SceneKit ve SpriteKit'in yeni, gelişmiş özelliklerinin yanı sıra, BirKit, ReplayKit, Model I/O, MetalKit ve Metal Performance Shader'ları içerir.
Bu makalede iOS 9'un yeni oyun geliştirmeleriyle Xamarin.iOS oyunlarınızı geliştirmenin tüm yolları tanıtacak:
INTRODUCINGKit tanıtımı
Apple'ın yeni BirKit çerçevesi, uygulama için gerekli yinelenen ve ortak kod miktarını azaltarak iOS cihazları için oyun oluşturmanızı kolaylaştıran bir dizi teknoloji sunar. Bir oyun mekaniği geliştirmeye yönelik Araçlar sağlayan Bu araçlar daha sonra tamamlanmış bir oyunu hızla teslim etmek için bir grafik altyapısıyla (SceneKit veya SpriteKit gibi) kolayca bir araya edilebilir.
Oyun Seti, aşağıdakiler gibi çeşitli, yaygın oyun algoritmaları içerir:
- Davranış tabanlı, aracı simülasyonu, AI'nin otomatik olarak kovalayacak hareketlerini ve hedeflerini tanımlamaya olanak sağlar.
- Sıra tabanlı oyun için minmax yapay zeka.
- Yeni bir davranış sağlamak için belirsiz mantık ile veri odaklı oyun mantığı için bir kural sistemi.
Ayrıca, ModularKit aşağıdaki özellikleri sağlayan modüler bir mimari kullanarak oyun geliştirme için yapı taşı yaklaşımı benimser:
- Oyun oynamada karmaşık, yordamsal kod tabanlı sistemleri işlemeye ilişkin durum makinesi.
- Hata ayıklama sorunlarına neden olmadan rastgele oyun oynama ve kullanım dışı kalma sağlama araçları.
- Yeniden kullanılabilir, bileşenli varlık tabanlı bir mimari.
OlarakKit hakkında daha fazla bilgi edinmek için lütfen Apple'ın Birakit Programlama Kılavuzu'nda ve Birrkit Çerçeve Başvurusu'nda yer alan .
ExamplesKit Örnekleri
Şimdi oyun setini kullanarak bir Xamarin.iOS uygulamasında bazı basit oyun mekaniği uygulama adımlarını hızlı bir şekilde bakalım.
Yol bağlama
Yol bağlama, bir oyunun AI öğesinin oyun panosunda kendi yolunu bulma becerisidir. Örneğin, bir 2D bulgu, birinci kişi-dünya arazisinde bir veya 3D karakter üzerinden yolunu buluyor.
Aşağıdaki haritayı düşünün:
Bu C# kodunun pathfinding kullanılarak harita üzerinden bir yol bulun:
var a = GKGraphNode2D.FromPoint (new Vector2 (0, 5));
var b = GKGraphNode2D.FromPoint (new Vector2 (3, 0));
var c = GKGraphNode2D.FromPoint (new Vector2 (2, 6));
var d = GKGraphNode2D.FromPoint (new Vector2 (4, 6));
var e = GKGraphNode2D.FromPoint (new Vector2 (6, 5));
var f = GKGraphNode2D.FromPoint (new Vector2 (6, 0));
a.AddConnections (new [] { b, c }, false);
b.AddConnections (new [] { e, f }, false);
c.AddConnections (new [] { d }, false);
d.AddConnections (new [] { e, f }, false);
var graph = GKGraph.FromNodes(new [] { a, b, c, d, e, f });
var a2e = graph.FindPath (a, e); // [ a, c, d, e ]
var a2f = graph.FindPath (a, f); // [ a, b, f ]
Console.WriteLine(String.Join ("->", (object[]) a2e));
Console.WriteLine(String.Join ("->", (object[]) a2f));
Klasik Uzman Sistem
C# kodunun aşağıdaki kod parçacığında, Klasik uzman sistemini uygulamak için Nasıl Kullanılmaktadır?
string output = "";
bool reset = false;
int input = 15;
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
/*
If reset is true, clear the output and set reset to false
*/
var clearRule = GKRule.FromPredicate ((rules) => reset, rules => {
output = "";
reset = false;
});
clearRule.Salience = 1;
var fizzRule = GKRule.FromPredicate (mod (3), rules => {
output += "fizz";
});
fizzRule.Salience = 2;
var buzzRule = GKRule.FromPredicate (mod (5), rules => {
output += "buzz";
});
buzzRule.Salience = 2;
/*
This *always* evaluates to true, but is higher Salience, so evaluates after lower-salience items
(which is counter-intuitive). Print the output, and reset (thus triggering "ResetRule" next time)
*/
var outputRule = GKRule.FromPredicate (rules => true, rules => {
System.Console.WriteLine(output == "" ? input.ToString() : output);
reset = true;
});
outputRule.Salience = 3;
var rs = new GKRuleSystem ();
rs.AddRules (new [] {
clearRule,
fizzRule,
buzzRule,
outputRule
});
for (input = 1; input < 16; input++) {
rs.Evaluate ();
rs.Reset ();
}
}
protected Func<GKRuleSystem, bool> mod(int m)
{
Func<GKRuleSystem,bool> partiallyApplied = (rs) => input % m == 0;
return partiallyApplied;
}
Verilen bir kural kümesi ( ) ve bilinen bir giriş kümesine bağlı olarak, uzman sistem ( ) tahmin edilebilir çıkış (yukarıdaki örneğimizde) GKRuleGKRuleSystemfizzbuzz oluşturur.
Akın
Bir grup AI denetimli oyun varlığının yemek gibi davranmasına olanak sağlar. Burada grup, uçuşta kuş estiren kuş ya da kuş havuzu gibi bir baş varlığın hareketlerine ve eylemlerine yanıt verir.
C# kodunun aşağıdaki kod parçacığı, grafik ekranı için VeSpriteKit kullanarak davranışa devam ediyor:
using System;
using SpriteKit;
using CoreGraphics;
using UIKit;
using GameplayKit;
using Foundation;
using System.Collections.Generic;
using System.Linq;
using OpenTK;
namespace FieldBehaviorExplorer
{
public static class FlockRandom
{
private static GKARC4RandomSource rand = new GKARC4RandomSource ();
static FlockRandom ()
{
rand.DropValues (769);
}
public static float NextUniform ()
{
return rand.GetNextUniform ();
}
}
public class FlockingScene : SKScene
{
List<Boid> boids = new List<Boid> ();
GKComponentSystem componentSystem;
GKAgent2D trackingAgent; //Tracks finger on screen
double lastUpdateTime = Double.NaN;
//Hold on to behavior so it doesn't get GC'ed
static GKBehavior flockingBehavior;
static GKGoal seekGoal;
public FlockingScene (CGSize size) : base (size)
{
AddRandomBoids (20);
var scale = 0.4f;
//Flocking system
componentSystem = new GKComponentSystem (typeof(GKAgent2D));
var behavior = DefineFlockingBehavior (boids.Select (boid => boid.Agent).ToArray<GKAgent2D>(), scale);
boids.ForEach (boid => {
boid.Agent.Behavior = behavior;
componentSystem.AddComponent(boid.Agent);
});
trackingAgent = new GKAgent2D ();
trackingAgent.Position = new Vector2 ((float) size.Width / 2.0f, (float) size.Height / 2.0f);
seekGoal = GKGoal.GetGoalToSeekAgent (trackingAgent);
}
public override void TouchesBegan (NSSet touches, UIEvent evt)
{
boids.ForEach(boid => boid.Agent.Behavior.SetWeight(1.0f, seekGoal));
}
public override void TouchesEnded (NSSet touches, UIEvent evt)
{
boids.ForEach (boid => boid.Agent.Behavior.SetWeight (0.0f, seekGoal));
}
public override void TouchesMoved (NSSet touches, UIEvent evt)
{
var touch = (UITouch) touches.First();
var loc = touch.LocationInNode (this);
trackingAgent.Position = new Vector2((float) loc.X, (float) loc.Y);
}
private void AddRandomBoids (int count)
{
var scale = 0.4f;
for (var i = 0; i < count; i++) {
var b = new Boid (UIColor.Red, this.Size, scale);
boids.Add (b);
this.AddChild (b);
}
}
internal static GKBehavior DefineFlockingBehavior(GKAgent2D[] boidBrains, float scale)
{
if (flockingBehavior == null) {
var flockingGoals = new GKGoal[3];
flockingGoals [0] = GKGoal.GetGoalToSeparate (boidBrains, 100.0f * scale, (float)Math.PI * 8.0f);
flockingGoals [1] = GKGoal.GetGoalToAlign (boidBrains, 40.0f * scale, (float)Math.PI * 8.0f);
flockingGoals [2] = GKGoal.GetGoalToCohere (boidBrains, 40.0f * scale, (float)Math.PI * 8.0f);
flockingBehavior = new GKBehavior ();
flockingBehavior.SetWeight (25.0f, flockingGoals [0]);
flockingBehavior.SetWeight (10.0f, flockingGoals [1]);
flockingBehavior.SetWeight (10.0f, flockingGoals [2]);
}
return flockingBehavior;
}
public override void Update (double currentTime)
{
base.Update (currentTime);
if (Double.IsNaN(lastUpdateTime)) {
lastUpdateTime = currentTime;
}
var delta = currentTime - lastUpdateTime;
componentSystem.Update (delta);
}
}
public class Boid : SKNode, IGKAgentDelegate
{
public GKAgent2D Agent { get { return brains; } }
public SKShapeNode Sprite { get { return sprite; } }
class BoidSprite : SKShapeNode
{
public BoidSprite (UIColor color, float scale)
{
var rot = CGAffineTransform.MakeRotation((float) (Math.PI / 2.0f));
var path = new CGPath ();
path.MoveToPoint (rot, new CGPoint (10.0, 0.0));
path.AddLineToPoint (rot, new CGPoint (0.0, 30.0));
path.AddLineToPoint (rot, new CGPoint (10.0, 20.0));
path.AddLineToPoint (rot, new CGPoint (20.0, 30.0));
path.AddLineToPoint (rot, new CGPoint (10.0, 0.0));
path.CloseSubpath ();
this.SetScale (scale);
this.Path = path;
this.FillColor = color;
this.StrokeColor = UIColor.White;
}
}
private GKAgent2D brains;
private BoidSprite sprite;
private static int boidId = 0;
public Boid (UIColor color, CGSize size, float scale)
{
brains = BoidBrains (size, scale);
sprite = new BoidSprite (color, scale);
sprite.Position = new CGPoint(brains.Position.X, brains.Position.Y);
sprite.ZRotation = brains.Rotation;
sprite.Name = boidId++.ToString ();
brains.Delegate = this;
this.AddChild (sprite);
}
private GKAgent2D BoidBrains(CGSize size, float scale)
{
var brains = new GKAgent2D ();
var x = (float) (FlockRandom.NextUniform () * size.Width);
var y = (float) (FlockRandom.NextUniform () * size.Height);
brains.Position = new Vector2 (x, y);
brains.Rotation = (float)(FlockRandom.NextUniform () * Math.PI * 2.0);
brains.Radius = 30.0f * scale;
brains.MaxSpeed = 0.5f;
return brains;
}
[Export ("agentDidUpdate:")]
public void AgentDidUpdate (GameplayKit.GKAgent agent)
{
}
[Export ("agentWillUpdate:")]
public void AgentWillUpdate (GameplayKit.GKAgent agent)
{
var brainsIn = (GKAgent2D) agent;
sprite.Position = new CGPoint(brainsIn.Position.X, brainsIn.Position.Y);
sprite.ZRotation = brainsIn.Rotation;
Console.WriteLine ($"{sprite.Name} -> [{sprite.Position}], {sprite.ZRotation}");
}
}
}
Ardından, bu sahneyi bir görünüm denetleyicisinde gerçekleştirin:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Perform any additional setup after loading the view, typically from a nib.
this.View = new SKView {
ShowsFPS = true,
ShowsNodeCount = true,
ShowsDrawCount = true
};
}
public override void ViewWillLayoutSubviews ()
{
base.ViewWillLayoutSubviews ();
var v = (SKView)View;
if (v.Scene == null) {
var scene = new FlockingScene (View.Bounds.Size);
scene.ScaleMode = SKSceneScaleMode.AspectFill;
v.PresentScene (scene);
}
}
Çalıştırıca, küçük animasyonlu "Boid'ler" parmak dokunuşlarımızın etrafında hareket ediyor olur:
Diğer Apple Örnekleri
Yukarıda sunulan örneklere ek olarak Apple, C# ve Xamarin.iOS'a kodladülen aşağıdaki örnek uygulamaları da sağlanmıştır:
- FourInARow: AI Için EsnotKit Minmax Stratejist'ini Kullanma
- AgentsCatalog: Agents System in AgentsKit'i Kullanma
- DemoBots: SpriteKit ve YerKot seti ile Platformlar Arası Oyun Bina
Metal
iOS 9'da Apple, GPU'ya düşük ek yük erişimi sağlamak için Metal'e çeşitli değişiklikler ve eklemeler yaptı. Metal'i kullanarak iOS uygulamalarınızı grafik ve işlem potansiyelini en üst düzeye çıkarabilirsiniz.
Metal çerçevesi aşağıdaki yeni özellikleri içerir:
- OS X için yeni özel ve derinlik kalıp dokuları.
- Derinlik sıkıştırması ve ayrı ön ve arka kalıp değerleriyle gölge kalitesi geliştirildi.
- Metal Gölgelendirme Dili ve Metal Standart Kitaplığı geliştirmeleri.
- Hesaplama gölgelendiricileri daha geniş bir piksel biçimlerini destekler.
The MetalKit Framework
MetalKit çerçevesi, bir iOS uygulamasında Metal kullanmak için gereken iş miktarını azaltan bir dizi yardımcı sınıf ve özellik sağlar. MetalKit üç temel alanda destek sağlar:
- PNG, JPEG, KTX ve PVR gibi yaygın biçimler de dahil olmak üzere çeşitli kaynaklardan zaman uyumsuz doku yükleme.
- Metal'e özgü model işleme için Model I/O tabanlı varlıkların kolay erişimi. Bu özellikler, Model I/O çerçeveleri ile Metal arabellekleri arasında verimli veri aktarımı sağlamak için yüksek oranda iyileştirilmiştir.
- Bir iOS uygulamasında grafik işlemeleri görüntülemek için gereken kod miktarını büyük ölçüde azaltan önceden tanımlanmış Metal görünümleri ve görünüm yönetimi.
MetalKit hakkında daha fazla bilgi edinmek için bkz. Apple'ın MetalKit Framework Başvurusu, Metal Programlama Kılavuzu,Metal Framework Başvurusu ve Metal Gölgelendirme Dil Kılavuzu.
Metal Performans Gölgelendiricileri Çerçevesi
Metal Performance Shader çerçevesi, Metal tabanlı iOS uygulamalarınız için yüksek oranda iyileştirilmiş grafik ve hesaplama tabanlı gölgelendiriciler kümesi sağlar. Metal Performance Shader çerçevesindeki her gölgelendirici, Metal tarafından desteklenen iOS GPU'larda yüksek performans sağlayacak şekilde özel olarak ayarlanmıştır.
Metal Performance Shader sınıflarını kullanarak, tek tek kod tabanlarını hedeflemek ve korumak zorunda kalmadan her bir iOS GPU'da mümkün olan en yüksek performansa ulaşabilirsiniz. Metal Performans Gölgelendiricileri dokular ve arabellekler gibi herhangi bir Metal kaynağıyla kullanılabilir.
Metal Performance Shader çerçevesi, aşağıdakiler gibi bir dizi ortak gölgelendirici sağlar:
- Gauss Bulanıklığı ( )
- Sobel Edge Algılama ( )
- Görüntü Histogramı ( )
Daha fazla bilgi için bkz. Apple'ın Metal Gölgelendirme Dili Kılavuzu.
Model I/O tanıtımı
Apple'ın Model I/O çerçevesi, 3D varlıkları (modeller ve ilgili kaynakları gibi) hakkında derin bir anlayış sağlar. Model I/O; iOS oyunlarınızı, KullanılmaktadırKit, Metal ve SceneKit ile birlikte kullanılmaktadır fiziksel tabanlı malzemeler, modeller ve aydınlatma ile sağlar.
Model I/O ile aşağıdaki görev türlerini destekleyebilirsiniz:
- Çeşitli popüler yazılım ve oyun altyapısı biçimlerinden aydınlatma, malzemeler, örgü verileri, kamera ayarları ve diğer sahne tabanlı bilgileri içeri aktarın.
- Bir örgüye procedurd sky veya bake aydınlatması oluşturma gibi sahne tabanlı bilgileri işlendirin veya oluşturun.
- Oyun varlıklarını işleme için GPU arabelleklerine verimli bir şekilde yüklemek için MetalKit, SceneKit ve GLKit ile çalışır.
- Sahne tabanlı bilgileri çeşitli popüler yazılım ve oyun altyapısı biçimlerine dışarı aktarın.
Model I/O hakkında daha fazla bilgi edinmek için lütfen Apple'ın Model I/O Framework Başvurusu'na bakın
ReplayKit tanıtımı
Apple'ın yeni ReplayKit çerçevesi, oyun kaydını iOS oyunnize kolayca eklemenize ve kullanıcının bu videoyu uygulamanın içinde hızla ve kolayca düzenlemesine ve paylaşmasına olanak sağlar.
Daha fazla bilgi için lütfen Apple'ın ReplayKit ve Game Center videosunu ve bunların DemoBot'ları: SpriteKit ve BirAkit ile Platformlar Arası Oyun Bina örnek uygulamasına bakın.
SceneKit
Scene Kit, 3D grafiklerle çalışmayı basitleştiren bir 3D sahne grafiği API'dir. İlk olarak OS X 10.8'de tanıtıldı ve şimdi iOS 8'e geldi. Scene Kit'in çevreleyici 3D görselleştirmeler ve gündelik 3D oyunlar oluşturması, OpenGL uzmanlığı gerektirmez. Sahne Seti, yaygın sahne grafı kavramlarını temel alan OpenGL ve OpenGL ES karmaşıklıklarını soyutlar ve bir uygulamaya 3D içerik eklemenizi çok kolaylaştırır. Ancak, bir OpenGL uzmanıysanız Scene Kit'in doğrudan OpenGL'ye de müdahale etme desteği vardır. Ayrıca fizik gibi 3 boyutlu grafikleri tamamlayan çok sayıda özellik içerir ve Core Animation, Core Image ve Sprite Kit gibi diğer birçok Apple çerçevesiyle de çok iyi tümleştirilmiştir.
Daha fazla bilgi için lütfen SceneKit belgelerimize bakın.
SceneKit Değişiklikleri
Apple, iOS 9 için SceneKit'e aşağıdaki yeni özellikleri ekledi:
- Xcode artık doğrudan Xcode'dan sahneleri düzenleyerek hızlıca oyunlar ve etkileşimli 3D uygulamalar derlemeye olanak sağlayan bir Sahne Düzenleyicisi sağlar.
- ve
SCNViewSCNSceneRenderersınıfları, Metal işlemeyi (desteklenen iOS cihazlarında) etkinleştirmek için kullanılabilir. - ve
SCNAudioPlayerSCNNodesınıfları, bir iOS uygulamasına bir oynatıcı konumunu otomatik olarak takip etmek için uzamsal ses etkileri eklemek için kullanılabilir.
Daha fazla bilgi için bkz. SceneKit Belgelerimiz ve Apple'ın SceneKit Framework Başvurusu ve Fox: Xcode Scene Editor ile SceneKit Oyunu Bina örnek projesi.
SpriteKit
Apple'ın 2D oyun çerçevesi olan Sprite Kit, iOS 8 ve OS X Yosemite'de bazı ilginç yeni özelliklere sahiptir. Bunlar Scene Kit tümleştirmesi, gölgelendirici desteği, aydınlatma, gölgeler, kısıtlamalar, normal harita oluşturma ve fizik geliştirmeleridir. Özellikle yeni fizik özellikleri, bir oyun için gerçekçi etkiler eklemeyi çok kolaylaştırır.
Daha fazla bilgi için lütfen SpriteKit belgelerimize bakın.
SpriteKit değişiklikleri
Apple, iOS 9 için SpriteKit 'e aşağıdaki yeni özellikleri ekledi:
- Otomatik olarak Player 'ın sınıfla konumunu izleyen uzamsal ses efekti
SKAudioNode. - Xcode artık kolay 2B oyun ve uygulama oluşturma için bir sahne Düzenleyicisi ve Eylem Düzenleyicisi sunar.
- Yeni kamera düğümleri () nesneleriyle kolayca kaydırılan oyun desteği
SKCameraNode. - Metal 'yı destekleyen iOS cihazlarda, zaten özel OpenGL ES gölgelendiricileri kullanıyor olsanız bile, bu dosyayı işlemek için otomatik olarak kullanacaktır.
Daha fazla bilgi için lütfen SpriteKit belgeleri Apple 'ın SpriteKit Framework başvurusu ve bunların demoonları: SpriteKit ve GameplayKit örnek uygulamasıyla platformlar arası bir oyun oluşturma konusuna bakın.
Özet
Bu makalede, Xamarin. iOS uygulamalarınız için iOS 9 ' un sağladığı yeni oyun özellikleri ele alınmıştır. Oyunplaykit ve model g/ç 'yi kullanıma sunmuştur Metal için önemli geliştirmeler; Ayrıca, manzara ve SpriteKit özelliklerinin yeni özellikleri.

