前回のコメント

・自前のメソッドを使いこなせるようになりたいです。

 是非。
 いろいろと試してみてください。

・関数の呼び出しの流れがわかりやすかったです。

 関数/メソッドは部品化の基礎なので、じっくりと解説しました。
 クラスも含むとさらに面白くなりますので、お楽しみに。

講義メモ 後半

補足:自前のメソッド

・Unityのスクリプトでは、MonoBehaviourを継承しているクラスの中に自由にメソッドを記述できる
・そして、Start()メソッドやUpdate()メソッドの中から呼び出すことができる
・あるいは、自前のメソッドの中で自前のメソッドを呼び出すこともできる
・定義書式: 戻り値型 メソッド名(引数の型 引数名, …) {処理内容}
・なお、戻り値がない場合は戻り値型を「void」とする(無の意味)
・引数がない場合はカッコの中は不要だが、カッコは必要
・例: void Greet() { Debug.Log("処理開始"); } //開始表示をする自前のメソッド
・定義しただけでは動作しないので、呼び出す必要がある
・呼び出し書式: メソッド名(引数, …)
・なお、戻り値がある場合、呼び出しをDebug.Log()の中で行うと、戻り値を表示できる。
 呼び出しを式の中で行うと、戻り値が式に渡される。
・引数がない場合はカッコだけを書く(使わない引数を書くとエラー)

ミニ演習 mini060a.cs

・開始表示をする自前のメソッドをStartメソッドの上または下に記述する
    void Greet() { 
        Debug.Log("処理開始"); 
    }
・Startメソッドでこれを呼び出してみよう

作成例

using UnityEngine;

public class mini060a : MonoBehaviour {
    void Greet() { //自前のメソッドGreet()の定義
        Debug.Log("処理開始"); 
    }
    void Start() {
        Greet(); //自前のメソッドGreet()を呼ぶ
    }
}

ミニ演習 mini060b.cs

・int型の引数を2つ渡すと和を表示する自前のAdd2メソッドをStartメソッドの上または下に記述する
・Startメソッドでこれを呼び出してみよう

作成例

using UnityEngine;

public class mini060b : MonoBehaviour {
    void Add2(int a, int b) { //自前のメソッドAdd2(int,int)の定義
        Debug.Log(a + b); //和を表示
    }
    void Start() {
        Add2(10, 20); //自前のメソッドAdd2()に2引数を渡して呼ぶ
    }
}

補足:自前のメソッド:戻り値の返し方

・戻り値のメソッドでは「return 式または値;」を最後に必ず実行する必要がある。
・この式または値の型と、メソッドの戻り値型を合わせるのが基本。
・例: string Greets() { return "やあ"; } //文字列「やあ」を返すメソッド

ミニ演習 mini060c.cs

・int型の引数を2つ渡すと和を返す(表示しない)自前のAddメソッドをStartメソッドの上または下に記述する
・Startメソッドでこれを呼び出して、戻り値を表示しよう

作成例(動作順序説明バージョン)

using UnityEngine;

public class mini060c : MonoBehaviour {
    int Add(int a, int b) { //自前のメソッド int Add(int,int)の定義
        return a + b; //③和を返す
    }
    void Start() {
        int r; //①戻り値を格納する為の変数
        r = Add(10, 20); //②Add()に2引数を渡して呼び、④戻り値を代入
        Debug.Log(r); //⑤戻り値を表示
    }
}

作成例(短縮バージョン)

using UnityEngine;

public class mini060c : MonoBehaviour {
    int Add(int a, int b) { //自前のメソッド int Add(int,int)の定義
        return a + b; //②和を返す
    }
    void Start() {
        Debug.Log(Add(10, 20)); //①引数を渡してAddを呼び、③戻り値を得て表示
    }
}

補足:自前のメソッド:オーバーロード

・自前のメソッドでもオーバーロード(同じ名前のメソッドに型や個数&順序が異なる引数を与えると動作を変えられること)が可能。
例:
    int Add(int a, int b) { return a + b; }
    double Add(double a, double b) { return a + b; }
・ただし、戻り値型のみが異なるメソッドはオーバーロードにはならず、定義すると文法エラーになる
・引数の数や並び順が異なるオーバーロードも可能
例:
    int Add(int a, int b, int c) { return a + b + c; }
    int Add(int a, double b) { return a + (int)b; }
    int Add(double a, int b) { return (int)a + b; }

ミニ演習 mini060d.cs

・上記の5つのメソッドを全て定義するとどうなるか確認しよう
 この時、どれが呼ばれたか分かるように「Debug.Log」で適当な文字列を表示しよう
・Startメソッドで5つ全てを呼び出して、結果を確認しよう

作成例

using UnityEngine;

public class mini060d : MonoBehaviour {
    int Add(int a, int b) { //自前のメソッド①int Add(int,int)の定義
        Debug.Log("①int Add(int,int)が呼ばれた");
        return a + b; //整数和を返す
    }
    double Add(double a, double b) { //自前のメソッド②double Add(double,double)の定義
        Debug.Log("②double Add(double,double)が呼ばれた");
        return a + b; //実数和を返す
    }
    int Add(int a, int b, int c) { //自前のメソッド③int Add(int,int,int)の定義
        Debug.Log("③int Add(int,int,int)が呼ばれた");
        return a + b + c; //整数の総和を返す
    }
    int Add(int a, double b) { //自前のメソッド④int Add(int,double)の定義
        Debug.Log("④int Add(int,double)が呼ばれた");
        return a + (int)b; //整数と整数化した実数の和を返す
    }
    int Add(double a, int b) { //自前のメソッド⑤int Add(double,int)の定義
        Debug.Log("⑤int Add(double,int)が呼ばれた");
        return (int)a + b; //整数化した実数と整数の和を返す
    }
    void Start() {
        Debug.Log(Add(10, 20)); //引数を渡してAdd①を呼び、戻り値を得て表示
        Debug.Log(Add(3.14, 20.5)); //引数を渡してAdd②を呼び、戻り値を得て表示
        Debug.Log(Add(10, 20, 30)); //引数を渡してAdd③を呼び、戻り値を得て表示
        Debug.Log(Add(10, 3.14)); //引数を渡してAdd④を呼び、戻り値を得て表示
        Debug.Log(Add(3.14, 100)); //引数を渡してAdd⑤を呼び、戻り値を得て表示
    }
}

提出:ミニ演習 mini060a/b/c/d.csのどれか

講義メモ

・p.058「メソッドとオブジェクト」から

提出フォロー: ミニ演習 mini057.cs

・例:(int)'A' ⇒ 文字'A'の文字コードである65になる(10進数に変換される)
・例:(char)66 ⇒ 文字コード66である文字'B'になる
・上記を試して、結果を表示しよう
・また、文字コードを16進数(前に0xを付ける)で与えてみよう

作成例

using UnityEngine;

public class mini057 : MonoBehaviour {
    void Start() {
        Debug.Log((int)'A'); //65(10進数)、16進数41
        Debug.Log((char)66); //'B'(10進数66)
        Debug.Log((char)0x42); //'B'(16進数42)
    }
}

p.058 メソッドとオブジェクト:引数と戻り値

・メソッド:0個以上の情報を受け取り、動作し、0または1個の情報を返す仕組みで、C言語などにおける関数(ファンクション)と同様のもの
・この「受け取る情報」を引数(パラメータ)、「返す情報」を戻り値(返却値)という
・なお、Debug.LogはUnityが提供しているメソッドで、引数には表示したい情報を指定する。戻り値は0個(無し)となっている。
・Debug.Log(引数)となっている通り、メソッドの引数はカッコ内に記述し、2個以上の場合はカンマで区切る。
・また、Unityが提供しているメソッドに平方根を計算してくれる Mathf.Sqrt()メソッドがあり、引数は単精度実数、
 戻り値も単精度実数(float型)。
・メソッドの戻り値はそのまま表示や処理したり、式の一部として用いることが可能
 例: 変数 = Mathf.Sqrt(16) + 1.0; //16の平方根4.0に1.0を加えた結果を変数に代入
・最大値を返すMathf.Max()メソッドがあり、引数はint型またはfloat型で個数は可変、戻り値はint型またはfloat型。
・Chap1_12_1では、int型の引数を4個与えて、int型の戻り値を得ている。
・また、変数の初期化における初期値をメソッドの戻り値にすることもできるので、初期化においてメソッド内の処理を実行できる

アレンジ演習:p.059 Chap1_12_1.cs

・上の例「変数 = Mathf.Sqrt(16) + 1.0;」を適切な変数型を指定して追記しよう。
 ⇒ 1.0はdouble型なので、float型 + double型で、変数はdouble型にする
・また、この変数値を表示しよう。

作成例

using UnityEngine;

public class Chap1_12_1 : MonoBehaviour {
    void Start() {
        int value = Mathf.Max(10, 40, 20, 30); //メソッドの戻り値で初期化  
        Debug.Log(value);
        //【以下追加】
        double d = Mathf.Sqrt(16) + 1.0; //float型 + double型でdouble型になる
        Debug.Log(d + " 型は" + d.GetType()); //5 型はSystem.Double
        //【以下参考】
        float f = Mathf.Sqrt(16) + 1.0f; //float型 + float型でfloat型になる
        Debug.Log(f + " 型は" + f.GetType()); //5 型はSystem.Single
    }
}

補足:Unityが提供するメソッドの情報を得る方法

・Unityのリファレンスでオフィシャル情報を得ることができるが、VSでも要約情報が得られる
・なお、入力中にもヒントが得られるが、未入力部分をVSが推測した結果になるので、望んでいない情報になることもある

補足:メソッドのオーバーロードについて

・Mathf.Sqrt()メソッドは引数、戻り値共にfloat型のみと定義されている
・しかし、C#などのオブジェクト指向言語ではオーバーロードが可能
・オーバーロードとは「同じ名前のメソッドに型や個数&順序が異なる引数を与えると動作を変えられる」こと
・Mathf.Max()メソッドにはオーバーロードが4つ定義されている
①引数が2個のfloat型であれば単精度実数における最大値を得て、float型の戻り値として返す
②引数の型が全てfloat型であれば単精度実数における最大値を得て、float型の戻り値として返す
③引数が2個のint型であれば整数における最大値を得て、int型の戻り値として返す
④引数の型が全てint型であれば整数における最大値を得て、int型の戻り値として返す
・どれが呼び出されるかは呼び出し時の引数によって決まる
・今回の「Mathf.Max(10, 40, 20, 30)」では④が呼び出され、int型の戻り値40が返されたことがわかる。
・なお、オーバーロードとして定義されているパターンにあてはまらない呼び出し方をすると文法エラーになる
 例:Mathf.Max(10.1, 40.4, 20.2, 30.1); //double型なのでエラー
 例:Mathf.Max(10.1, 40.4, 20.2, 30.1); //double型なのでエラー
 例:Mathf.Max(10.1f, 40.4f, 20.2f, 30.1f); //float型なのでOK
 例:Mathf.Max('A', 'B', 'a', 'b'); //char型はint型に暗黙変換できるのでOK
 例:Mathf.Max(10, 10.1f); //10はint型だがfloat型に暗黙変換し、戻り値はfloat型
・なお、プログラマが自前のメソッドを記述でき、オーバーロードを定義することも可能

ミニ演習 mini060.cs

・パブリック変数で4個の整数値(int型)を受け取り、最大値を表示しよう

作成例

using UnityEngine;

public class mini060 : MonoBehaviour {
    public int a, b, c, d; //パブリック変数
    void Start() {
        Debug.Log(Mathf.Max(a, b, c, d)); //最大値を得て表示
    }
}

今週の話題

ゲームソフト販売本数ランキング:今週1位は「ファンタジーライフi グルグルの⻯と時をぬすむ少女(Switch)」 GO!
6月7日より開催の「Summer Game Fest 2025」は60以上のパートナーが参加!スイッチ2も名を連ねる GO!
「BitSummit the 13th」オフィシャルPRサポーターズ&追加スポンサー発表!そのほか松竹の新作『夢幻桜楼閣』出展も明らかに GO!
「150点のゲームを毎回作る」「人がプレイしてなんぼ」―“カプコン流”のアートや仕事の秘訣とは?「大カプコン展」会場で実施!クリエイター対談イベントをレポート GO!

EAのマーベル「ブラックパンサー」ゲームが開発中止…開発スタジオも閉鎖、日の目を見ることなく消滅へ GO!
「ワンピース」酷似の『パイレーツアニメクエスト』マイニンテンドーストアから削除 GO!

【参考】Switch2でアップデートしたフレームレートやHDR、DLSS、レイトレーシングなどの用語をなるべくわかりやすく解説してみます  GO!

前回のコメント

・””に連結するとstring型の変数に代入できることに驚きました。

 「●.ToSring()」で行う方が良いという方もいますが、
 「文字列に連結して文字列にする」のは手軽で便利な方法なので、良く使われます。
 動作は同じですので、チームルールがあれば合わせると良いでしょう。

・キャスト機能を知らなかったので便利そうだなぁと思いました。

 型変換の基礎であると同時に「プログラマの責任で行う」リスクもある手法です。
 キャストできない(異常終了してしまう)可能性を確認しながら使いこなしてください。

講義メモ 後半

p.056 補足:組み込み型と文字/論理/文字列リテラル

・既出の通り、string型変数には文字列リテラルを代入できる
 ※内部的には文字列リテラルが先にメモリ上に展開され、その参照が代入される
 例: string atmarks = "@@@";
・char型変数には文字リテラルを代入できる
・文字リテラルは1文字をシングルコーテーションで囲んだもの
 例: char atmark = '@';
・bool型変数には論理(真理値)リテラルを代入できる
・真理値リテラルは真偽をtrue/falseで示すもの
 ※真偽は正しいかどうかではなく「あてはまる/あてはまらない」「はい/いいえ」「済/未済」などの意味に用いる
 ※C/C++では整数値で論理(真理値)を扱えるが、C#ではできない

p.056 型を変換する

・ある整数型から、その範囲を含む整数型へは暗黙の型変換が行われる
 例: int i = 100; long l = i; //longはintの範囲を完全に含むので暗黙の型変換
・なお、値が範囲内でも型が範囲を完全に含まなければ暗黙の型変換は行われない
 例: int i = 100; uint u = i; //uintはintの範囲を完全に含まないのでエラー
・上の例の場合はプログラマの責任(判断)で強制的に型変換することが可能で、これをキャスト(型キャスト)という
・キャストの書式: (型)値または式 //変数1個でも式扱い
 例: int i = 100; uint u = (unit)i; //uint型にキャストすればOK
・キャストを利用すると整数型への実数型からの代入が可能になり、小数点以下があれば切り捨てられる
 例: int seisuu = (int)3.5; //int型にキャストすれば3になり代入OK
・string型へのキャストはできないが、長さゼロの文字列""への連結により、整数、実数、文字を文字列にすることができる
 例: string text = "" + 30.14; //文字列"30.14"になる

アレンジ演習:p.057 Chap1_11_1.cs

・以下の確認を追加しよう
・sbyte型の変数を100で初期化し、short型の変数に代入できること
・intの変数を100で初期化し、uint型にキャストすればuint型の変数に代入できること
・実数-3.5をint型にキャストすると、-3になるか-4になるのか
 ⇒-3になる。0に近い方の整数になるので負の数でも見かけ上、小数点以下カットになる
・文字'@'を文字列""に連結すると、string型の変数に代入できること

作成例

using UnityEngine;

public class Chap1_11_1 : MonoBehaviour {
    void Start() {
        int seisuu = (int)3.5; //キャストで小数点以下切り捨てで3になる
        string text = "" + 110; //連結で文字列"110"になる
        Debug.Log(seisuu + text); //連結で文字列"3110"になる

        //sbyte型の変数を100で初期化し、short型の変数に代入できる
        sbyte sb = 100; short sh = sb; //暗黙の型変換
        Debug.Log("sh = " + sh); //100になる
        //intの変数を100で初期化し、uint型にキャストすればuint型の変数に代入できる
        int i = 100; uint u = (uint)i; //uintにキャスト
        Debug.Log("u = " + u); //100になる
        //実数-3.5をint型にキャストすると、-3になるか-4になるのか
        Debug.Log("-3.5をint型にキャストすると  " + (int)-3.5); //-3になる
        //文字'@'を文字列""に連結すると、string型の変数に代入できる
        string s = "" + '@'; //文字列に文字を連結すると文字列
        Debug.Log("s = " + s); //文字列"@"になる
    }
}

p.056 型を変換する:補足

・全く関係のない型から型への変換は基本的にはできない
・例外として、文字型と整数型のキャストがあり、文字が内部的に整数値である文字コードで扱われているため
・例:(int)'A' ⇒ 文字'A'の文字コードである65になる(10進数に変換される)
・例:(char)66 ⇒ 文字コード66である文字'B'になる

ミニ演習 mini057.cs

・上記の例を試して、結果を表示しよう
・また、文字コードを16進数(前に0xを付ける)で与えてみよう

補足: .NET型表記について

・例えばVSで「200000000」にマウスを乗せる「readonly struct System.Int32」と表示される
・この「System.Int32」がC#を含む.NETフレームワークにおける型の表現で、
 C#側のエラーメッセージにおいても使われることが多い
・int、doubleなどの型名はC言語由来で、C言語の型の定義があいまいであること
 (例えばint型の大きさは不定)がトラブルの原因になる
・そこで、開発現場でも.NET型表記を用いる事がある(チームルールで統一することもある)
・例: 
 short ⇒ System.Int16
 int ⇒ System.Int32
 long ⇒ System.Int64
 float ⇒ System.Single
 double ⇒ System.Double
 uint ⇒ System.UInt32
 ulong ⇒ System.UInt64

提出: ミニ演習 mini057.cs

講義メモ

・p.056「組み込み型とは」から

p.056 組み込み型とは

・C#のデータ型には、あらかじめ用意されている組み込み型と、プログラマが定義できるとユーザ定義型がある。
・すでに登場したstring、doubleは組み込み型で、doubleは基本型、stringは参照型に分類される
・基本型は1個の大きさが決まっている型で、整数型、実数(浮動小数点数)型、文字型、論理型がある。
・整数型は大きさが4種類あり、種類ごとに符号有りと符号無し(0と正の数のみ)がある。
・整数型:符号有り4種類
①sbyte  8ビット           -128~127
②short 16ビット        -32,768~32,767
③int   32ビット -2,147,483,648~2,147,483,647 ※整数型の代表
④long  64ビット -9223372036854775808~9223372036854775807
・整数型:符号無し4種類
①byte    8ビット 0~255
②ushort 16ビット 0~65535
③uint   32ビット 0~4294967296
④ulong  64ビット 0~18446744073709551616
・実数型:3種類(全て符号有り
①float    32ビット -3.402823E+38~3.402823E+38 単精度浮動小数点数用(誤差が大きい)
②double   64ビット -1.79769313486232E+308~1.79769313486232E+308 倍精度浮動小数点数用(誤差が小さい)
③decimal 128ビット :-79228162514264337593543950335~79228162514264337593543950335 誤差がほぼ無い
(ほぼ-7.9E+29~7.9E+29)

ミニ演習 mini056.cs

・整数型、実数型の最大値、最小値は「型名.MaxValue」「型名.MinValue」で得られることを確認しよう
・実数型の最大値、最小値が指数表記になることを確認しよう
⇒指数表記は実数を「●×10の±■乗」に変換して「●E±■」という書式にしたもの。
 ●が1.0~9.999…になるように■を調整するのが一般的。
 (0.0~0.999…になるように調整する形式もある)
 例:314.1592 ⇒ 3.141592×10の2乗 ⇒ 3.141592E+2

作成例


using UnityEngine;

public class mini056 : MonoBehaviour {
    void Start() {
        Debug.Log("sbyte Min:" + sbyte.MinValue + " Max:" + sbyte.MaxValue);
        Debug.Log("short Min:" + short.MinValue + " Max:" + short.MaxValue);
        Debug.Log("int Min:" + int.MinValue + " Max:" + int.MaxValue);
        Debug.Log("long Min:" + long.MinValue + " Max:" + long.MaxValue);
        Debug.Log("byte Min:" + byte.MinValue + " Max:" + byte.MaxValue);
        Debug.Log("ushort Min:" + ushort.MinValue + " Max:" + ushort.MaxValue);
        Debug.Log("uint Min:" + uint.MinValue + " Max:" + uint.MaxValue);
        Debug.Log("ulong Min:" + ulong.MinValue + " Max:" + ulong.MaxValue);
        Debug.Log("float Min:" + float.MinValue + " Max:" + float.MaxValue);
        Debug.Log("double Min:" + double.MinValue + " Max:" + double.MaxValue);
        Debug.Log("decimal Min:" + decimal.MinValue + " Max:" + decimal.MaxValue);
    }
}

p.056 組み込み型とは(つづき)

・文字型
①char 16ビット(半角文字であっても16ビット)文字1文字のみ
・論理型
①bool 情報量としては1ビット分 真偽(true/false)のみ
・文字列型(参照型)
①string 参照型で文字列の参照(≒位置情報)を持つ

p.056 補足:組み込み型の使い分け

・整数型は内部的にint型で扱われるので、int型にしておくと効率が良い
・実数型は内部的にdouble型で扱われるので、double型にしておくと効率が良い
・ただし、大量のデータを扱うにはbyte、shortなどにしてメモリを節約可能
・また、Unityでは内部的にflortを用いることが多い
・符号無し型は、絶対に負の数にはならない場合などに用いるとトラブルを防止できる

p.056 補足:組み込み型と整数/実数リテラル

・テキストp.056「代表的な組み込み型」の「値の書き方」は型に対応するリテラルの書式の説明になっている
・整数リテラルはint型扱いになる(sbyte/short型にも代入可能)
・なお、int型の範囲を超える整数リテラルは値に応じて自動的にuint、long、ulong型扱いになる
・整数リテラルの末尾に「u」または「U」をつけることでuint型扱いを明示できる
・整数リテラルの末尾に「l」または「L」をつけることでlong型扱いを明示できる(※通常「l」は推奨されない)
・整数リテラルの末尾に「ul」または「UL」をつけることでulong型扱いを明示できる
・実数リテラルはdouble型扱いになる(指数表記も可能だが、float/decimalには代入できない)
・実数リテラルの末尾に「f」または「F」をつけることでfloat型扱いになる
・実数リテラルの末尾に「m」または「M」をつけることでdecimal型扱いになる

ミニ演習 mini056a.cs

・上記を試すプログラムを作ろう
・すべての整数型、実数型の変数を初期化して表示すればよい
・文法エラーになるものはコメントアウトしよう

作成例

using UnityEngine;

public class mini056a : MonoBehaviour {
    void Start() {
        sbyte sb = 100; Debug.Log("sbyte : " + sb);
        // sbyte sb = 300; Debug.Log("sbyte : " + sb); 範囲超過でエラー
        short sh = 100; Debug.Log("short : " + sh);
        // short sh = 90100; Debug.Log("short : " + sh); 範囲超過でエラー
        int it = 100; Debug.Log("int : " + it);
        // int it = 2200000000; Debug.Log("int : " + it); 範囲超過でエラー
        long lo = 2200000000; Debug.Log("long : " + lo);
        long ln = 2200000000L; Debug.Log("long : " + ln); //「L」で明示可能

        byte by = 100; Debug.Log("byte : " + by);
        //byte by = -100; Debug.Log("byte : " + by); 負の数不可でエラー
        ushort us = 100; Debug.Log("ushort : " + us);
        uint ui = 2200000000; Debug.Log("uint : " + ui); //「U」省略可
        uint un = 2200000000U; Debug.Log("uint : " + un); //「U」で明示可能
        ulong ug = 2200000000; Debug.Log("ulong : " + ug); //「UL」省略可
        ulong ul = 2200000000UL; Debug.Log("ulong : " + ul); //「UL」で明示可能

        //float fl = 3.14; Debug.Log("float : " + fl); //3.14はdouble型なのでエラー
        float fl = 3.14F; Debug.Log("float : " + fl); //「F」で明示必須
        double du = 3.141592E+2; Debug.Log("double : " + du); //指数表記可
        //decimal dc = 3.14; Debug.Log("decimal :" + dc); //3.14はdouble型なのでエラー
        decimal dc = 3.14M; Debug.Log("decimal :" + dc); //「M」で明示必須
    }
}

今週の話題

ゲームソフト販売本数ランキング:今週1位は「カプコン ファイティング コレクション2(Switch)」 GO!
「MMORPG運営はユーザーの気持ちがわかるのか」運営Dとユーザーを呼んで答え合わせしてみた。 GO!
AI活用ゲーム開発ハッカソン、賞金100万円を獲得した作品は?QwenのAlibaba Cloud主催『Tokyo Game Jam』イベントリポート GO!
PlayStationロイヤリティプログラム「PlayStation Stars」2026年11月2日サービス終了。新規メンバー受付はすでに終了 GO!

トランプ対策!?テイクツー、年次報告の多様性に関する表記を「思考の多様性」に置き換え―LGBTQ支援で授賞の雇用賞も表記せず GO!
米ニュースメディア連合、Google 『AIモード』は記事の「窃盗そのものだ」と非難 GO!