所以我有2个课(声音课,音频管理器课)
我不明白为什么我们可以在不创建Sound类实例的情况下访问Sound的字段。()
像之间有什么区别
public Sound test1;
Run Code Online (Sandbox Code Playgroud)
和
Sound test2 = new Sound();
Run Code Online (Sandbox Code Playgroud)
这对我来说很奇怪,因为我在学习C#教程时/您只能通过创建该类的实例来访问另一个类的变量,但是在Unity中,您只能通过键入public Sound test1来访问它;
声音等级
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
[System.Serializable]
public class Sound
{
public AudioClip clip;
public string name;
public float volume;
public float pitch;
public AudioSource soundclass_source;
}
Run Code Online (Sandbox Code Playgroud)
AudioManager类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
public class AudioManager : MonoBehaviour
{
public Sound test1;
Sound test2 = new Sound();
test1.name = "test1"; // without new
test2.name = "test2"; // with new
}
Run Code Online (Sandbox Code Playgroud)
因为它是[Serializable]和统一检查器的MonoBehaviour和ScriptableObject(等)的类自动初始化序列字段具有默认实例之间不存在差
public Sound test1;
Run Code Online (Sandbox Code Playgroud)
和
public Sound test1 = new Sound();
Run Code Online (Sandbox Code Playgroud)
(public如果类型可序列化,则字段默认情况下将被序列化)
还要注意,一旦您在Unity中创建了实例并通过检查器设置了值,这些序列化的值将始终取代您在此处进行硬编码的值。如果您稍后决定例如预先初始化一些值并将其更改为
public Sound test1 = new Sound() { name = "test1" };
Run Code Online (Sandbox Code Playgroud)
因为将采用在检查器中配置的值,所以它将无效。此编码值仅在实例创建之初或Reset在组件上下文菜单中单击时使用。
如果以后要使用编码值,则必须在方法中分配新值(请参见下文)。
没有无障碍环境定义为一个场(/类/方法/属性/等)等public,protected或private在c#总装置private。
如果private您的情况类似于某个字段,则必须“手动”对其进行初始化,否则,类的默认值始终为null(==无实例引用)。
您可以像在课堂上静态地那样进行操作
private Sound test2 = new Sound();
Run Code Online (Sandbox Code Playgroud)
这意味着该实例已经在创建您的类的实例后立即创建,或者以后可以在类似方法中执行
private Sound test2;
private void Awake()
{
Sound test2 = new Sound();
}
Run Code Online (Sandbox Code Playgroud)
最后,您可以/应该private尽可能进行封装,但仍然可以将它们序列化=>显示在检查器中并使用以下[SerializeField]属性存储:
[SerilaizeField] private Sound test2;
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关Unity序列化的更多信息
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |