StoneのBLOG

生活这种事情,从来都是自我陶醉

0%

Unity知识点记录

更新内容

  • (2019/05/29) 更新MenuItem的详细使用
  • (2020/03/21) 更新CustomEditor的内容

    Unity的使用

    这次终于不是自己单枪匹马的干,而是真的项目中使用Unity引擎来做开发了。

先附上官方文档:

1.Unity C# 中的一些比较重要的使用

1.MenuItem

1
2
3
4
#if UNITY_EDITOR
[UnityEditor.MenuItem("Project/Operation")
public static void OperationRun(){}
#endif

或者

1
2
3
4
5
using UnityEditor;
using UnityEngine;

[MenuItem("Project/Operation")]
public static void OperationRun(){}

上面的用法,貌似也可以被叫做Debug Menu ,感觉用处相当大。

便利的调用一些比较麻烦的函数,触发条件和时机需要自己掌控等等,总而言之,这个很重要。

但是要注意添加的方法都是static的方法,调用非静态函数的方法,我知道的有两个:

  • 1.向静态函数中传递对象引用。
  • 2.在静态函数遍历所有对象找到那个想要的对象并调用对象函数,这限于Unity中debug场景,毕竟可以遍历场景中的所有对象。使用FindObjectofType之类的函数。

其他要注意的是,这个功能算是对UnityEditor的扩展功能,使用的时候不要忘记:

1
2
3
4
5
#if UNITY_EDITOR
using UnityEditor
#endif

加上编译选项才安全。

2.Unity C# 中的序列化(Serialization)

SerializeField

HideInInspector

【Unity】HideInInspectorとSerializeFieldの興味深い関係

Serializable

3.MessagePack

4.FindObjectOfType

(シーン上にある該当する物の中からUnityが適当に選んだ1つが返ります。1つも存在していなかったらnullが返ります)

ゲームオブジェクトを参照して、スクリプトにアクセスするのがGetCompornetで、

スクリプトを参照して、スクリプトにアクセスするのがFindObjectOfTypeです。

就像上面说的那样,下面附上使用:

1
2
3
public static Object FindObjectOfType (Type type);

public static Object[] FindObjectsOfType (Type type);

这个方法非常低效,不适合在每一帧都调用,可以利用SingletonPattern。

【Unity】GameObject.Find 系関数の処理速度の検証結果

5. Attribute

1. AddComponentMenu

2. RequireComponent

6. CustomEditor

Defines which object type the custom editor class can edit.

个人理解就是为自定义的类进行编辑器扩展。

1
2
3
4
// 无参数
[CustomEditor(typeof(CustomClass))]
// 有参数
[CustomEditor(typeof(CustomeClass), true)]

关于参数的解释,我贴一下源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;

namespace UnityEditor
{
//
// Summary:
// Tells an Editor class which run-time type it's an editor for.
public class CustomEditor : Attribute
{
//
// Summary:
// Defines which object type the custom editor class can edit.
//
// Parameters:
// inspectedType:
// Type that this editor can edit.
//
// editorForChildClasses:
// If true, child classes of inspectedType will also show this editor. Defaults
// to false.
public CustomEditor(Type inspectedType);
//
// Summary:
// Defines which object type the custom editor class can edit.
//
// Parameters:
// inspectedType:
// Type that this editor can edit.
//
// editorForChildClasses:
// If true, child classes of inspectedType will also show this editor. Defaults
// to false.
public CustomEditor(Type inspectedType, bool editorForChildClasses);

//
// Summary:
// If true, match this editor only if all non-fallback editors do not match. Defaults
// to false.
public bool isFallback { get; set; }
}
}

有参数版本的,设置为true的理由就是,inspedtedType子类也会显示这个部分的Editor内容。(说实话不太理解)

除此之外,isFallback变量的作用我也不是很理解。

7. ContextMenu

可以在Inspector视图里直接调用函数?

2.C# 语法

?类型声明

?? operator

$ operator

=> operator

看见的第一眼以为是lambda表达式,但是后面接着出现的是是变量而不是表达式。

相当于{get;}但是又不是简单的get。

1
2
3
◆ private A a => new A();
◆ = private A a { get { return new A(); } }
◆ ≠ private A a { get; } = new A();

where关键字

一般类型约束?

For example, you can declare a generic class, MyGenericClass, such that the type parameter T implements the IComparable<T> interface:

1
public class AGenericClass<T> where T : IComparable<T> { }

使用了模板但是约束了类型,是这样的么。

我发誓这个关键字在我以前用C#的时候肯定知道,但是我忘了。。

@

await/async

IEnumerator

3.Unity语法

1.Instantiate

根据Prefab生成实例。

3.LINQ (Linq)

当我想深入了解LINQ的时候,我发现我需要先理解Lambda表达式。

4.Reactive Extensions (Rx)

5.UniRx

这是我在知乎上找到的一篇文章,感觉能学到很多东西。

Reactive Extensions for Unity

6.Lambda

直接搜C# lambda最先出来的三个链接。

Unity中的插件

SteamVR Unity

要记录的是
SteamVR Unity Plugin v2这个Unity的VR开发插件。开始调查这个插件的契机是不知道SteamVR_Behaviour_Pose这个类的作用,而明白这个是插件的内容。

上面的这个人的文章我看很厉害就直接先粘链接了。

SteamVR_Behaviour_Pose

Amplify Shader Editor