[SerializeField] private Text clearText;//インスペクターで取得
private Color clearTextColor;
private float fadeSpeed = 0.02f;private void Start()
{
clearTextColor = clearText.color;
clearTextColor.a = 0;
}private void Update()
{
if (clearTextColor.a <= 1)
{
clearTextColor.a += fadeSpeed;
clearText.color = clearTextColor;
}
}
最初、clearTextColor変数を定義せずに
clearText.color.a += fadeSpeed;
と直接操作しようとしてエラーになって困りました。
それではclearText.color.aは一体何として扱われているのでしょうか?
クラスは参照型ですが構造体は値型であるため、プロパティを介した変数の代入を行うと、実体そのものではなくて実体がコピーされたものが値となってしまいます。
class Struct
{
//構造体として宣言
public Vector3 position;
}
class Property
{
//プロパティで宣言
public Vector3 position { get; set; }
}
void Start()
{
Struct a = new Struct();
a.position.x = 1.0f;//こちらは直接構造体を変更しているので問題なし Property b = new Property();
b.position.x = 1.0f;//こちらはプロパティを介して構造体を変更しているのでエラー発生
}
/// <summary>
/// <para>Base color of the Graphic.</para>
/// </summary>
public virtual Color color {
get;
set;
}
clearText.color.a += fadeSpeed;
はエラーになります。
clearText.color = clearTextColor;
と記述するとエラーにならないのです。
その関数が返したstructはコピーでしかないということですか!
まだなんとなくですが納得です!
UnityのスクリプトリファレンスのColorのページには確かに「struct in UnityEngine」
とありますが、どれが構造体か探すのは難しいと思いました。
ColorやVector3以外にはどれがstructなのかわかるような一覧などが公式で用意されているのでしょうか?(探したのですが、見つけられませんでした。)
以下はTextクラスで宣言されているcolorプロパティです。
/// <summary>
/// <para>Base color of the Graphic.</para>
/// </summary>
public virtual Color color {
get;
set;
}
①について
Unityのスクリプトリファレンスでstructと検索してください。
https://docs.unity3d.com/ja/2019.4/ScriptReference/30_search.html?q=struct
②について
UnityのScriptingAPIでClass Textと検索してください。
Class Textのページに行くと、Textクラスが「Graphic」を継承しているのがわかると思います。
(正しくは、MaskableGraphicを継承しており、そのMaskableGraphicがGraphicを継承している状態です)
そのGraphicのページに行くと、colorプロパティの宣言を確認することができます。
@1.0/api/UnityEngine.UI.Graphic.html" target="_blank" rel="noopener noreferrer" data-stringify-link="https://docs.unity3d.com/Packages/com.unity.ugui@1.0/api/UnityEngine.UI.Graphic.html" data-sk="tooltip_parent" aria-describedby="sk-tooltip-19929"> https://docs.unity3d.com/Packages/com.unity.ugui @1.0/api/UnityEngine.UI.Graphic.html