[UI/2D物理シミュレーション課題]clearTextColorについて | Unity Forum | Tech Stadium Forum

[UI/2D物理シミュレーション課題]...
 
通知
すべてクリア

[UI/2D物理シミュレーション課題]clearTextColorについて  

  RSS

Student
(@student)
メンバー Moderator
結合: 4年前
投稿: 1325
17/03/2021 1:15 pm  
textをフェードインさせる際、
[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;
と直接操作しようとしてエラーになって困りました。
CS1612: Cannot modify the return value of ‘Graphic.color’ because it is not a variable
 
なぜclearText.color.aを変更することはできないのでしょうか?
 
clearText.color.aはvariable(変数?)ではないとありますが、
それではclearText.color.aは一体何として扱われているのでしょうか?
This topic was modified 3年前 by Student

引用
Teacher
(@admin)
メンバー Admin
結合: 4年前
投稿: 1296
17/03/2021 1:19 pm  
少し複雑な話になるので、理解が難しければ深く気にせず「colorやpositionの値は直接代入できない」と覚えておきましょう。
 
今回エラーが起こってしまった原因は、Colorがクラスではなく構造体だったからです。
クラスは参照型ですが構造体は値型であるため、プロパティを介した変数の代入を行うと、実体そのものではなくて実体がコピーされたものが値となってしまいます。
 
少しややこしいですが、プロパティを介した構造体の変数へ代入をする際に、また別の構造体をコピーしてしまってそちらに代入してしまうわけです。
コピーをした構造体に代入をしても意味がないので、C#はエラーを出してくれます。
    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;//こちらはプロパティを介して構造体を変更しているのでエラー発生
}
Textクラスのcolorはプロパティであるため、colorにColor型の値を代入することはできますが、color.aを直接変更することはできません。 
以下はTextクラスで宣言されているcolorプロパティです。
	/// <summary>
/// <para>Base color of the Graphic.</para>
/// </summary>
public virtual Color color {
get;
set;
}
なので「clearText.color.aは一体何なのか?」については「プロパティを介した構造体」であり、C#では「プロパティを介した構造体の変数を変更することはできない」ので
clearText.color.a += fadeSpeed;
はエラーになります。
 
解決するためには「プロパティのsetterを呼び出すために、構造体の型で代入してあげる必要がある」ので
clearText.color = clearTextColor;
と記述するとエラーにならないのです。

返信引用
Student
(@student)
メンバー Moderator
結合: 4年前
投稿: 1325
17/03/2021 1:20 pm  
なるほど!プロパティは変数に見える「関数」なので、
その関数が返したstructはコピーでしかないということですか!
まだなんとなくですが納得です!
 
その上で続けての質問恐縮なのですが、
UnityのスクリプトリファレンスのColorのページには確かに「struct in UnityEngine」
とありますが、どれが構造体か探すのは難しいと思いました。
 
①Vector3もstructであることは有名なので知っていたのですが、
ColorやVector3以外にはどれがstructなのかわかるような一覧などが公式で用意されているのでしょうか?(探したのですが、見つけられませんでした。)
 
②また、

以下はTextクラスで宣言されているcolorプロパティです。
/// <summary>
///   <para>Base color of the Graphic.</para>
/// </summary>
public virtual Color color {
get;
set;
}

とご回答いただきましたが、こちらのソースはどこで閲覧できるのでしょうか?

返信引用
Teacher
(@admin)
メンバー Admin
結合: 4年前
投稿: 1296
17/03/2021 1:22 pm  

①について
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


返信引用
共有:
タイトルとURLをコピーしました