Kodlama yönergeleri — MRTK2
Bu belgede MRTK'ya katkıda bulunurken izleyebileceğiniz kodlama ilkeleri ve kuralları özetlenmiştir.
Felsefe
Kısa olun ve basitlik için çabalayın
En basit çözüm genellikle en iyisidir. Bu, bu yönergeleri geçersiz kılma amaçlıdır ve tüm kodlama etkinliklerinin hedefi olmalıdır. Basit olmanın bir parçası da kısa ve mevcut kodla tutarlı olmaktır. Kodunuzu basit tutmaya çalışın.
Okuyucular yalnızca yararlı bilgiler sağlayan yapıtlarla karşılaşmalıdır. Örneğin, bariz olan şeyleri yeniden ifade eden yorumlar ek bilgi sağlamaz ve gürültü ile sinyal oranını artırır.
Kod mantığını basit tutun. Bunun en az sayıda satır kullanma, tanımlayıcı adlarının veya küme ayracı stilinin boyutunu en aza indirmeyle ilgili bir ifade olmadığını, kavramların sayısını azaltma ve tanıdık desenler aracılığıyla bunların görünürlüğünü en üst düzeye çıkarma hakkında bir ifade olduğunu unutmayın.
Tutarlı, okunabilir kod oluşturma
Kod okunabilirliği düşük hata oranlarıyla ilişkilendirilir. Okuması kolay bir kod oluşturmaya çabalayın. Basit mantığa sahip olan ve mevcut bileşenleri yeniden kullanan bir kod oluşturmaya çabalayın, bu da doğruluğun sağlanmasına yardımcı olur.
En temel doğruluk ayrıntısından tutarlı stil ve biçimlendirmeye kadar, ürettiğiniz kodun tüm ayrıntıları. Tercihinize uygun olmasa bile kodlama stilinizi mevcut olanlarla tutarlı tutun. Bu, genel kod tabanının okunabilirliğini artırır.
Bileşenleri hem düzenleyicide hem de çalışma zamanında yapılandırma desteği
MRTK, Unity düzenleyicisinde bileşenleri yapılandırmayı ve önkoşulları yüklemeyi tercih eden ve çalışma zamanında nesnelerin örneğini oluşturması ve yapılandırması gereken kişiler olmak üzere çok çeşitli kullanıcıları destekler.
Tüm kodunuz, kaydedilmiş bir sahnede GameObject'e bileşen ekleyerek ve bu bileşeni kodda başlatarak çalışmalıdır. Testler hem prefab örneği oluşturmak hem de örneği oluşturmak ve bileşeni çalışma zamanında yapılandırmak için bir test çalışması içermelidir.
Düzenleyicide oynatma, ilk ve birincil hedef platformunuzdur
Düzenleyicide Oynat, Unity'de yinelemenin en hızlı yoludur. Müşterilerimizin hızlı bir şekilde yinelemesi için yollar sağlamak, hem daha hızlı çözüm geliştirmelerine hem de daha fazla fikir denemelerine olanak tanır. Başka bir deyişle yineleme hızını en üst düzeye çıkarmak müşterilerimizin daha fazlasını başarmalarına yardımcı olur.
Her şeyin düzenleyicide çalışmasını sağlayın, ardından başka bir platformda çalışmasını sağlayın. Düzenleyicide çalışmaya devam edin. Play-In-Editor'a yeni bir platform eklemek kolaydır. Uygulamanız yalnızca bir cihazda çalışıyorsa, Düzenleyicide Oynat'ın çalışmasını sağlamak çok zordur.
Yeni genel alanlar, özellikler, yöntemler ve seri hale getirilmiş özel alanları dikkatli bir şekilde ekleyin
Genel bir yöntem, alan, özellik eklediğinizde mrtk'nin genel API yüzeyinin bir parçası olur. ile [SerializeField]
işaretlenen özel alanlar da alanları düzenleyicide kullanıma sunar ve genel API yüzeyinin bir parçasıdır. Diğer kişiler bu ortak yöntemi kullanabilir, genel alanınızla özel önkoşullar yapılandırabilir ve bu yönteme bir bağımlılık alabilir.
Yeni genel üyeler dikkatle incelenmelidir. Gelecekte tüm ortak alanlara bakım yapılması gerekir. Bir ortak alanın (veya seri hale getirilmiş özel alanın) türü değişirse veya MonoBehaviour'dan kaldırılırsa, bunun diğer kişileri kırabileceğini unutmayın. Alanın önce bir sürüm için kullanım dışı bırakılması ve bağımlılıkları alan kişiler için değişiklikleri geçirme kodunun sağlanması gerekir.
Yazma testlerinin önceliğini belirleme
MRTK, çeşitli katkıda bulunanlar tarafından değiştirilen bir topluluk projesidir. Bu katkıda bulunanlar hata düzeltmenizin / özelliğinizin ayrıntılarını bilmeyebilir ve özelliğinizi yanlışlıkla bozabilir. MRTK, her çekme isteğini tamamlamadan önce sürekli tümleştirme testleri çalıştırır. Testleri bozan değişiklikler iade edilemez. Bu nedenle testler, diğer kişilerin özelliğinizi bozmamasını sağlamanın en iyi yoludur.
Bir hatayı düzelttiğinizde, gelecekte gerilemediğinden emin olmak için bir test yazın. Özellik ekliyorsanız, özelliğinizin çalıştığını doğrulayan testler yazın. Bu, deneysel özellikler dışındaki tüm UX özellikleri için gereklidir.
C# Kodlama kuralları
Betik lisans bilgileri üst bilgileri
Yeni dosyalara katkıda bulunan tüm Microsoft çalışanları, tam olarak aşağıda gösterildiği gibi yeni dosyaların en üstüne aşağıdaki standart Lisans üst bilgisini eklemelidir:
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
İşlev / yöntem özet üst bilgileri
MRTK'ya gönderilen tüm genel sınıflar, yapılar, sabit listeleri, işlevler, özellikler, alanlar, aşağıda gösterildiği gibi amacı ve kullanımı olarak açıklanmalıdır:
/// <summary>
/// The Controller definition defines the Controller as defined by the SDK / Unity.
/// </summary>
public struct Controller
{
/// <summary>
/// The ID assigned to the Controller
/// </summary>
public string ID;
}
Bu, belgelerin tüm sınıflar, yöntemler ve özellikler için düzgün bir şekilde oluşturulmasını ve dağıtılmasını sağlar.
Düzgün özet etiketleri olmadan gönderilen tüm betik dosyaları reddedilir.
MRTK ad alanı kuralları
Karma Gerçeklik Araç Seti, tüm temel ad alanlarının "Microsoft.MixedReality.Toolkit" ile başladığı özellik tabanlı bir ad alanı modeli kullanır. Genel olarak, ad alanlarınızda araç seti katmanını (ör. Çekirdek, Sağlayıcılar, Hizmetler) belirtmeniz gerekmez.
Şu anda tanımlanmış olan ad alanları şunlardır:
- Microsoft.MixedReality.Toolkit
- Microsoft.MixedReality.Toolkit.Boundary
- Microsoft.MixedReality.Toolkit.Diagnostics
- Microsoft.MixedReality.Toolkit.Editor
- Microsoft.MixedReality.Toolkit.Input
- Microsoft.MixedReality.Toolkit.SpatialAwareness
- Microsoft.MixedReality.Toolkit.Teleport
- Microsoft.MixedReality.Toolkit.Utilities
Büyük miktarda türü olan ad alanları için, kapsam belirleme kullanımına yardımcı olmak için sınırlı sayıda alt ad alanı oluşturmak kabul edilebilir.
Bir arabirim, sınıf veya veri türü için ad alanının atlanması, değişikliğinizin engellenmesine neden olur.
Yeni MonoBehaviour betikleri ekleme
Çekme isteğiyle yeni MonoBehaviour betikleri eklerken özniteliğin tüm geçerli dosyalara uygulandığından AddComponentMenu
emin olun. Bu, bileşen ekle düğmesinin altındaki düzenleyicide kolayca bulunabilir olmasını sağlar. Bileşen bir soyut sınıf gibi düzenleyicide gösterilemiyorsa öznitelik bayrağı gerekli değildir.
Aşağıdaki örnekte , buradaki Paket bileşenin paket konumuyla doldurulmalıdır. BIR öğe MRTK/SDK klasörüne yerleştirilecekse paket SDK olacaktır.
[AddComponentMenu("Scripts/MRTK/{Package here}/MyNewComponent")]
public class MyNewComponent : MonoBehaviour
Yeni Unity denetçi betikleri ekleme
Genel olarak, MRTK bileşenleri için özel denetçi betikleri oluşturmaktan kaçınmaya çalışın. Unity altyapısı tarafından işlenebilen kod tabanının ek yükünü ve yönetimini ekler.
Bir denetçi sınıfı gerekiyorsa Unity'nin DrawDefaultInspector()
öğesini kullanmayı deneyin. Bu da denetçi sınıfını basitleştirir ve işin büyük kısmını Unity'ye bırakır.
public override void OnInspectorGUI()
{
// Do some custom calculations or checks
// ....
DrawDefaultInspector();
}
Denetçi sınıfında özel işleme gerekiyorsa ve EditorGUILayout.PropertyField
kullanmayı SerializedProperty
deneyin. Bu, Unity'nin iç içe yerleştirilmiş önkoşulları ve değiştirilmiş değerleri işlemeyi doğru şekilde işlemesini sağlar.
Özel mantıktaki bir gereksinim nedeniyle kullanılamıyorsa EditorGUILayout.PropertyField
, tüm kullanımın çevresinde EditorGUI.PropertyScope
sarmalandığından emin olun. Bu, Unity'nin verilen özellik ile iç içe yerleştirilmiş prefablar ve değiştirilmiş değerler için denetçiyi doğru şekilde işlemesini sağlar.
Ayrıca, özel denetçi sınıfını ile CanEditMultipleObjects
süslemeyi deneyin. Bu etiket, sahnede bu bileşene sahip birden çok nesnenin birlikte seçilip değiştirilebilmesini sağlar. Tüm yeni denetçi sınıfları, kodlarının sahnede bu durumda çalışıp çalışmadığını test etmelidir.
// Example inspector class demonstrating usage of SerializedProperty & EditorGUILayout.PropertyField
// as well as use of EditorGUI.PropertyScope for custom property logic
[CustomEditor(typeof(MyComponent))]
public class MyComponentInspector : UnityEditor.Editor
{
private SerializedProperty myProperty;
private SerializedProperty handedness;
protected virtual void OnEnable()
{
myProperty = serializedObject.FindProperty("myProperty");
handedness = serializedObject.FindProperty("handedness");
}
public override void OnInspectorGUI()
{
EditorGUILayout.PropertyField(destroyOnSourceLost);
Rect position = EditorGUILayout.GetControlRect();
var label = new GUIContent(handedness.displayName);
using (new EditorGUI.PropertyScope(position, label, handedness))
{
var currentHandedness = (Handedness)handedness.enumValueIndex;
handedness.enumValueIndex = (int)(Handedness)EditorGUI.EnumPopup(
position,
label,
currentHandedness,
(value) => {
// This function is executed by Unity to determine if a possible enum value
// is valid for selection in the editor view
// In this case, only Handedness.Left and Handedness.Right can be selected
return (Handedness)value == Handedness.Left
|| (Handedness)value == Handedness.Right;
});
}
}
}
Yeni ScriptableObjects Ekleme
Yeni ScriptableObject betikleri eklerken, özniteliğin CreateAssetMenu
tüm geçerli dosyalara uygulandığından emin olun. Bu, bileşenin varlık oluşturma menüleri aracılığıyla düzenleyicide kolayca bulunabilmesini sağlar. Bileşen bir soyut sınıf gibi düzenleyicide gösterilemiyorsa öznitelik bayrağı gerekli değildir.
Aşağıdaki örnekte, varsa Alt klasör MRTK alt klasörüyle doldurulmalıdır. BIR öğe MRTK/Providers klasörüne yerleştirilecekse paket Sağlayıcılar olacaktır. MRTK/Core klasörüne bir öğe yerleştiriyorsa, bunu "Profiller" olarak ayarlayın.
Aşağıdaki örnekte MyNewService | MyNewProvider , varsa yeni sınıfınızın adıyla doldurulmalıdır. Bir öğeyi MixedRealityToolkit klasörüne yerleştiriyorsa, bu dizeyi dışarıda bırakın.
[CreateAssetMenu(fileName = "MyNewProfile", menuName = "Mixed Reality Toolkit/{Subfolder}/{MyNewService | MyNewProvider}/MyNewProfile")]
public class MyNewProfile : ScriptableObject
Günlüğe Kaydetme
Yeni özellikler eklerken veya mevcut özellikleri güncelleştirirken, gelecekte hata ayıklama için yararlı olabilecek ilginç kodlara DebugUtilities.LogVerbose günlükleri eklemeyi göz önünde bulundurun. Burada günlüğe kaydetme ile eklenen kirlilik ile yeterli günlük kaydı olmaması (tanılamayı zorlaştırır) arasında bir denge vardır.
Günlüğe kaydetmenin yararlı olduğu ilginç bir örnek (ilginç yükle birlikte):
DebugUtilities.LogVerboseFormat("RaiseSourceDetected: Source ID: {0}, Source Type: {1}", source.SourceId, source.SourceType);
Bu günlük türü, eşleşmeyen kaynak algılanan ve kaynak kaybı olaylarından kaynaklanan gibi https://github.com/microsoft/MixedRealityToolkit-Unity/issues/8016sorunların yakalanmasına yardımcı olabilir.
Her karede gerçekleşen veriler ve olaylar için günlük eklemekten kaçının; ideal olarak günlük kaydı, ayrı kullanıcı girişleri tarafından yönetilen "ilginç" olayları kapsamalıdır (örneğin, bir kullanıcı tarafından "tıklama" ve günlüğe kaydetmesi ilginç olan değişiklikler ve olaylar kümesi). Her karenin günlüğe kaydedildiği "kullanıcı hala bir hareket tutuyor" durumunun devam ediyor olması ilginç değildir ve günlükleri bunaltacaktır.
Bu ayrıntılı günlüğün varsayılan olarak açık olmadığını unutmayın ( Tanılama Sistemi ayarlarında etkinleştirilmesi gerekir)
Boşluklar ve sekmeler
Bu projeye katkıda bulunurken sekmeler yerine 4 boşluk kullandığınızdan emin olun.
Aralık
Köşeli ayraçlar ve parantezler arasına ek boşluk eklemeyin:
Yapmayın
private Foo()
{
int[ ] var = new int [ 9 ];
Vector2 vector = new Vector2 ( 0f, 10f );
}
Yapın
private Foo()
{
int[] var = new int[9];
Vector2 vector = new Vector2(0f, 10f);
}
Adlandırma kuralları
Özellikler için her zaman kullanın PascalCase
. camelCase
ve const
alanları dışında çoğu alan için static readonly
kullanınPascalCase
. Bunun tek istisnası, alanların tarafından serileştirilmesini gerektiren veri yapılarıdır JsonUtility
.
Yapmayın
public string myProperty; // <- Starts with a lowercase letter
private string MyField; // <- Starts with an uppercase letter
Yapın
public string MyProperty;
protected string MyProperty;
private static readonly string MyField;
private string myField;
Erişim değiştiricileri
Tüm alanlar, özellikler ve yöntemler için her zaman bir erişim değiştiricisi bildirin.
Türetilmiş bir sınıfta geçersiz kılmanız gerekmediği sürece tüm Unity API Yöntemleri varsayılan olarak olmalıdır
private
. Bu durumdaprotected
kullanılmalıdır.Alanlar her zaman
private
veyaprotected
özellik erişimcileri ile olmalıdırpublic
.İfade gövdeli üyeleri ve mümkün olduğunda otomatik özellikleri kullanma
Yapmayın
// protected field should be private
protected int myVariable = 0;
// property should have protected setter
public int MyVariable => myVariable;
// No public / private access modifiers
void Foo() { }
void Bar() { }
Yapın
public int MyVariable { get; protected set; } = 0;
private void Foo() { }
public void Bar() { }
protected virtual void FooBar() { }
Ayraç kullanma
Her deyim bloğundan sonra her zaman ayraç kullanın ve bunları bir sonraki satıra yerleştirin.
Yapmayın
private Foo()
{
if (Bar==null) // <- missing braces surrounding if action
DoThing();
else
DoTheOtherThing();
}
Yapmayın
private Foo() { // <- Open bracket on same line
if (Bar==null) DoThing(); <- if action on same line with no surrounding brackets
else DoTheOtherThing();
}
Yapın
private Foo()
{
if (Bar==true)
{
DoThing();
}
else
{
DoTheOtherThing();
}
}
Ortak sınıfların, yapıların ve sabit listelerin tümü kendi dosyalarına girmelidir
Sınıf, yapı veya sabit listesi özel hale getirilebiliyorsa, aynı dosyaya dahil edilebilir. Bu, Unity ile derleme sorunlarını önler ve uygun kod soyutlamanın oluşmasını sağlar, ayrıca kodun değiştirilmesi gerektiğinde çakışmaları ve hataya neden olan değişiklikleri azaltır.
Yapmayın
public class MyClass
{
public struct MyStruct() { }
public enum MyEnumType() { }
public class MyNestedClass() { }
}
Yapın
// Private references for use inside the class only
public class MyClass
{
private struct MyStruct() { }
private enum MyEnumType() { }
private class MyNestedClass() { }
}
Yapın
MyStruct.cs
// Public Struct / Enum definitions for use in your class. Try to make them generic for reuse.
public struct MyStruct
{
public string Var1;
public string Var2;
}
MyEnumType.cs
public enum MuEnumType
{
Value1,
Value2 // <- note, no "," on last value to denote end of list.
}
MyClass.cs
public class MyClass
{
private MyStruct myStructReference;
private MyEnumType myEnumReference;
}
Sabit listelerini başlatma
.NET, 0'dan başlayarak tüm sabit listelerinin doğru şekilde başlatıldığından emin olmak için, yalnızca ilk (starter) değeri ekleyerek sabit listesi otomatik olarak başlatmanız için düzenli bir kısayol sağlar. (örneğin, Değer 1 = 0 Kalan değerler gerekli değildir)
Yapmayın
public enum Value
{
Value1, <- no initializer
Value2,
Value3
}
Yapın
public enum ValueType
{
Value1 = 0,
Value2,
Value3
}
Uygun uzantı için sıra sabit listeleri
Bir Sabit Listesi'nin gelecekte genişletilme olasılığı varsa, varsayılan değerleri Enum'un en üstünde sıralamak için, bu durum Enum dizinlerinin yeni eklemelerden etkilenmemesini sağlar.
Yapmayın
public enum SDKType
{
WindowsMR,
OpenVR,
OpenXR,
None, <- default value not at start
Other <- anonymous value left to end of enum
}
Yapın
/// <summary>
/// The SDKType lists the VR SDKs that are supported by the MRTK
/// Initially, this lists proposed SDKs, not all may be implemented at this time (please see ReleaseNotes for more details)
/// </summary>
public enum SDKType
{
/// <summary>
/// No specified type or Standalone / non-VR type
/// </summary>
None = 0,
/// <summary>
/// Undefined SDK.
/// </summary>
Other,
/// <summary>
/// The Windows 10 Mixed reality SDK provided by the Universal Windows Platform (UWP), for Immersive MR headsets and HoloLens.
/// </summary>
WindowsMR,
/// <summary>
/// The OpenVR platform provided by Unity (does not support the downloadable SteamVR SDK).
/// </summary>
OpenVR,
/// <summary>
/// The OpenXR platform. SDK to be determined once released.
/// </summary>
OpenXR
}
Bit alanları için numaralandırma kullanımını gözden geçirme
Bir sabit listesi için değer olarak birden çok durum gerektirebilir; örneğin, Elle Kullanım = Sol & Sağ. Ardından Enum'un doğru şekilde kullanılmasını sağlamak için BitFlags ile doğru şekilde dekore edilmesi gerekir
Handedness.cs dosyasında bunun için somut bir uygulama var
Yapmayın
public enum Handedness
{
None,
Left,
Right
}
Yapın
[Flags]
public enum Handedness
{
None = 0 << 0,
Left = 1 << 0,
Right = 1 << 1,
Both = Left | Right
}
Sabit kodlanmış dosya yolları
Dize dosyası yolları oluştururken ve özellikle sabit kodlanmış dize yolları yazarken aşağıdakileri yapın:
- veya
Path.GetFullPath
gibiPath.Combine
mümkün olduğunca C#'nin API'leriniPath
kullanın. - \ veya
Path.DirectorySeparatorChar
\\ yerine / veya kullanın.
Bu adımlar MRTK'nin hem Windows hem de Unix tabanlı sistemlerde çalışmasını sağlar.
Yapmayın
private const string FilePath = "MyPath\\to\\a\\file.txt";
private const string OtherFilePath = "MyPath\to\a\file.txt";
string filePath = myVarRootPath + myRelativePath;
Yapın
private const string FilePath = "MyPath/to/a/file.txt";
private const string OtherFilePath = "folder{Path.DirectorySeparatorChar}file.txt";
string filePath = Path.Combine(myVarRootPath,myRelativePath);
// Path.GetFullPath() will return the full length path of provided with correct system directory separators
string cleanedFilePath = Path.GetFullPath(unknownSourceFilePath);
Unity önerileri de dahil olmak üzere en iyi yöntemler
Bu projenin hedef platformlarından bazılarının performansı dikkate alması gerekir. Bunu göz önünde bulundurarak, sık çağrılan koddaki belleği sıkı güncelleştirme döngülerinde veya algoritmalarda ayırırken her zaman dikkatli olun.
Kapsülleme
Sınıf veya yapı dışından alana erişim gerekiyorsa her zaman özel alanları ve genel özellikleri kullanın. Özel alanı ve ortak özelliği birlikte bulmayı unutmayın. Bu, özelliği neyin yedeklediğini ve alanın betik tarafından değiştirilebilir olduğunu bir bakışta görmeyi kolaylaştırır.
Not
Bunun tek istisnası, alanların tarafından JsonUtility
seri hale getirilmesini gerektiren veri yapılarıdır. Burada, serileştirmenin çalışması için tüm genel alanlara sahip olmak için bir veri sınıfı gerekir.
Yapmayın
private float myValue1;
private float myValue2;
public float MyValue1
{
get{ return myValue1; }
set{ myValue1 = value }
}
public float MyValue2
{
get{ return myValue2; }
set{ myValue2 = value }
}
Yapın
// Enable field to be configurable in the editor and available externally to other scripts (field is correctly serialized in Unity)
[SerializeField]
[ToolTip("If using a tooltip, the text should match the public property's summary documentation, if appropriate.")]
private float myValue; // <- Notice we co-located the backing field above our corresponding property.
/// <summary>
/// If using a tooltip, the text should match the public property's summary documentation, if appropriate.
/// </summary>
public float MyValue
{
get => myValue;
set => myValue = value;
}
/// <summary>
/// Getter/Setters not wrapping a value directly should contain documentation comments just as public functions would
/// </summary>
public float AbsMyValue
{
get
{
if (MyValue < 0)
{
return -MyValue;
}
return MyValue
}
}
Mümkün olduğunca değerleri önbelleğe alın ve sahne/ön bellekte seri hale getirme
HoloLens'i göz önünde bulundurarak, çalışma zamanı bellek ayırmalarını sınırlamak için sahnedeki veya ön bellekteki performans ve önbellek başvurularını iyileştirmek en iyisidir.
Yapmayın
void Update()
{
gameObject.GetComponent<Renderer>().Foo(Bar);
}
Yapın
[SerializeField] // To enable setting the reference in the inspector.
private Renderer myRenderer;
private void Awake()
{
// If you didn't set it in the inspector, then we cache it on awake.
if (myRenderer == null)
{
myRenderer = gameObject.GetComponent<Renderer>();
}
}
private void Update()
{
myRenderer.Foo(Bar);
}
Malzemelere yönelik önbellek başvuruları, her seferinde ".material" olarak adlandırmayın
Unity her ".material" kullandığınızda yeni bir malzeme oluşturur ve bu da düzgün temizlenmediği takdirde bellek sızıntısına neden olur.
Yapmayın
public class MyClass
{
void Update()
{
Material myMaterial = GetComponent<Renderer>().material;
myMaterial.SetColor("_Color", Color.White);
}
}
Yapın
// Private references for use inside the class only
public class MyClass
{
private Material cachedMaterial;
private void Awake()
{
cachedMaterial = GetComponent<Renderer>().material;
}
void Update()
{
cachedMaterial.SetColor("_Color", Color.White);
}
private void OnDestroy()
{
Destroy(cachedMaterial);
}
}
Not
Alternatif olarak, Unity'nin her başvuruda yeni bir malzeme oluşturmayan "SharedMaterial" özelliğini kullanın.
Toolkit'in derlemeyi başka bir platformda bozmadığından emin olmak için platforma bağımlı derlemeyi kullanma
- UWP'ye özgü, Unity olmayan API'leri kullanmak için kullanın
WINDOWS_UWP
. Bu, düzenleyicide veya desteklenmeyen platformlarda çalışmaya çalışmalarını engeller. Bu eşdeğerdirUNITY_WSA && !UNITY_EDITOR
ve lehine kullanılmalıdır. - Ad alanı gibi UWP'ye özgü Unity API'lerini
UnityEngine.XR.WSA
kullanmak için kullanınUNITY_WSA
. Platform UWP olarak ayarlandığında ve yerleşik UWP uygulamalarında düzenleyicide bu işlem çalıştırılır.
Bu grafik, kullanım örneklerinize ve beklediğiniz derleme ayarlarına bağlı olarak hangisini #if
kullanacağınıza karar vermenize yardımcı olabilir.
Platform | UWP IL2CPP | UWP .NET | Düzenleyici |
---|---|---|---|
UNITY_EDITOR |
Yanlış | Yanlış | Doğru |
UNITY_WSA |
Doğru | Doğru | Doğru |
WINDOWS_UWP |
Doğru | Doğru | Yanlış |
UNITY_WSA && !UNITY_EDITOR |
Doğru | Doğru | Yanlış |
ENABLE_WINMD_SUPPORT |
Doğru | Doğru | Yanlış |
NETFX_CORE |
Yanlış | Doğru | Yanlış |
DateTime.Now yerine DateTime.UtcNow'u tercih edin
DateTime.UtcNow, DateTime.Now değerinden daha hızlıdır. Önceki performans araştırmalarında DateTime.Now kullanmanın özellikle Update() döngüsünde kullanıldığında önemli ek yük eklediğini tespit ettik. Diğerleri de aynı soruna çarptı.
Yerelleştirilmiş saatlere gerçekten ihtiyacınız yoksa DateTime.UtcNow kullanmayı tercih edin (geçerli saati kullanıcının saat diliminde göstermek istemeniz geçerli bir neden olabilir). Göreli sürelerle (yani son güncelleştirme ile şimdi arasındaki değişim) ilgileniyorsanız, saat dilimi dönüştürmeleri yapmanın ek yükünü önlemek için DateTime.UtcNow kullanmanız en iyisidir.
PowerShell kodlama kuralları
MRTK kod tabanının bir alt kümesi, işlem hattı altyapısı ve çeşitli betikler ve yardımcı programlar için PowerShell kullanır. Yeni PowerShell kodu PoshCode stiline uygun olmalıdır.