gpt4 book ai didi

C#/new关键字/类成员引用

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:32 25 4
gpt4 key购买 nike

所以我有 2 个类(声音类,AudioManager 类)

我不明白为什么我们可以在不创建 Sound 类实例的情况下访问 Sound 的字段。 ()

像之间有什么区别

public Sound test1;

Sound test2 = new Sound();

这对我来说很奇怪,因为当我学习 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;
}

音频管理类

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
}

最佳答案

因为它是 [Serializable]MonoBehaviourScriptableObject (等)类的 Unity Inspector < strong>自动初始化序列化字段与默认实例之间没有区别

public Sound test1;

public Sound test1 = new Sound();

(如果类型是可序列化的,则默认情况下序列化public字段)

另请注意,一旦您在 Unity 中创建了一个实例并通过 Inspector 设置了值,那些序列化的值将始终否决您在此处硬编码的值。如果您以后例如决定预先初始化一些值并将其更改为

public Sound test1 = new Sound() { name = "test1" };

它不会有任何效果,因为取而代之的是 Inspector 中配置的值。此编码值仅在第一次创建实例时使用,或者在您点击组件上下文菜单中的Reset 时使用。

如果您希望稍后使用编码值,您必须在方法中分配新值(见下文)。


中的publicprotectedprivate 等字段(/class/method/property/etc)没有可访问性定义c# 始终表示 private

如果一个字段是 private 就像你的情况一样,你必须“手动”初始化它,否则类的默认值总是 null (==没有实例引用) .

你可以像在类里面那样做

private Sound test2 = new Sound();

这意味着一旦你的类的实例被创建,实例就已经被创建了,或者可以稍后在类似的方法中创建它

private Sound test2;

private void Awake()
{
Sound test2 = new Sound();
}

最后,您可以/应该尽可能将它们设为private 以进行封装,但仍然可以将它们序列化=> 显示在Inspector 中并使用[SerializeField] 存储属性:

[SerilaizeField] private Sound test2;

你可以阅读更多关于Unity的序列化here

关于C#/new关键字/类成员引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57200925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com