Unityから半年くらい離れてしまっていたので、「Unity5の教科書」(北村愛実さん著)を読みなおしました。この本、とても分かりやすいです。

それにしても、UnityはScratchと似ていますね。今の流行りの形なのだと思います。

その機能の対応をまとめてみたくなりました。


Unity のscript refarence はこちらから

スプライト ➡ オブジェクト

Scratchは、キャラクターをスプライトと呼び、それぞれにプログラム(コード)を実装します。

Unityでは、オブジェクトという物体を定義し、そこにC#のプログラム(C# Script)をドラッグして関連付けます。 オブジェクトはプログラム中でGameObjectという型で扱われます。

位置と向きと大きさ

Scratchのスプライトは、x座標, y座標, 向きを持ち、自分のスプライトのコードからこの値を変更することでスプライトを動かします。また、大きさによって、スプライトの大きさを変えることもできます。

Unityでもオブジェクトがそのような情報を持ちます。3Dモードの場合(以下、3Dモードに限ります)、座標はpositoin = (X, Y, Z)、方向はRotation = (X, Y, Z)、大きさはScale = (X, Y, Z)となります。

以下、思いつくままに列挙していきます。

位置・方向の変更

x座標を10ずつ変える

// UNITY //
transform.Translate(new Vector3(10, 0, 0));
または、
transform.Translate(10, 0, 0);
以下、この書き方で。

(x, y, z)座標を(0.1, 2, 0)にする

// UNITY //
transform.position = new Vector3(0.1f, 2, 0) // 小数点の数値にはfをつける

回す。

世界座標系のy軸方向で10度回す(左手を握って親指を立てる。親指をy軸方向に向けた時、それ以外の指の方向が回転の正の方向になる)。

// UNITY //
transform.Rotate(0, 10, 0, Space.World);

自分座標系のy軸方向に10度回す。

// UNITY //
transform.Rotate(0, 10, 0, Space.Self);

フレームの更新速度に依存しない回し方。Time.deltaTime に前のフレームからの時間が入っているのでそれを利用する。

// UNITY //
transform.Rotate(0, Time.deltaTime*(360/10), 0);

位置・方向の取得

位置の取得。返り値は、Vector3型。

// UNITY //
Vector3 = transform.position;

方向の取得。x軸y軸z軸でどれだけ回転させたかを表すオイラー角。しかし、なぜかインスペクターの値と異なる。返り値は、Vector3型。

// UNITY //
Vector3 = transform.eulerAngles;

クォータニオンによる方向の取得。Quaternion型。4つの数値で回転を表す。演算に便利。

// UNITY //
Quaternion = transform.rotation;

それ以外、方向で便利そうなもの。

// UNITY //
Vector3 = transform.forward; オブジェクトのZ軸をワールド座標系で表したもの
Vector3 = transform.right; オブジェクトのx軸をワールド座標系で表したもの
Vector3 = transform.up; オブジェクトのy軸をワールド座標系で表したもの

マウスやキーで反応する

スペースキーが押されたら何か実行する場合、

// UNITY //
if(Input.GetKey(KeyCode.Space)){
    // ここに実行したい処理
}

他のキー、

// UNITY //
Input.GetKey(KeyCode.A) // Aのキー
Input.GetKey(KeyCode.UpArrow) // カーソル上
Input.GetKey(KeyCode.DownArrow) // カーソル下
Input.GetKey(KeyCode.LeftArrow) // カーソル左
Input.GetKey(KeyCode.RightArrow) // カーソル右

マウス

// UNITY //
Input.GetMouseButton(0) // 右クリック
Input.GetMouseButtonDown(1) // 左クリックを押したとき
Input.GetMouseButtonUp(1) // 左クリックを離したとき

別なオブジェクトの座標を取得

こういったのはScratchではできなくてちょっと不便でしたけど、Unityはできますね。
例えば、gameDirectorというオブジェクトに張り付けたgameDirector.cs というスクリプトから、
box01というオブジェクトの位置や座標を取得するには以下のようになります。

// UNITY //
public class gameDirector : MonoBehaviour
{
    GameObject box01; // 入れ物を作る

    void Start()
    {
        this.box01 = GameObject.Find("box01"); // box01を検索して入れ物に入れる
    }

    void Update()
    {
        Vector3 pos = this.box.transform.position; // 位置情報
        Vector3 angle = this.box01.transform.eulerAngles; // 向き情報
    }
}

シーンが変わると、そこで定義していたオブジェクトは消えてしまって、変数にアクセスできなくなりますが、DontDestroyOnLoad()を入れることで、オブジェクトを生き残らせることができるのですね。

void Start()
{
    DontDestroyOnLoad(this);
}

別なオブジェクトに張り付けたスクリプトの変数の値を取得

Scratchでは、グローバル変数を全てのスプライトでシェアできるから、こういったことは意識してなかったですね。

Unityの場合、例えば、box01というオブジェクトに、下のbox01Controller.csというスクリプトが張り付いていて、下のように、scoreというpublic 変数があったとします。

// UNITY //
public class box01Controller : MonoBehaviour
{
    public float score = 999.0f; // 外部からみれるようにpublic にすることが必要
    
    void Start()
    {
      
    }
}

それを、gameDirectorというオブジェクトに張り付けた、gameDirector.cs というスクリプトからscore という変数の中身を読むとしたら、以下のようになります。

// UNITY //
ublic class gameDirector : MonoBehaviour
{
    GameObject box01;

    void Start()
    {
        this.box01 = GameObject.Find("box01");
    }

    void Update()
    {
        // scrに score の値が入る
        float scr = this.box01.GetComponent().score;
    }
}

このGetComponentで、オブジェクトに関連付けられた色々な情報にアクセスできるようです。

別なオブジェクトに張り付けたスクリプトの関数を実行する

こんなのもScratchにはできないです。さっきと同じで、box01というオブジェクトに、下のbox01Controller.csというスクリプトが張り付いてたとします。その中に、外から使いたい pubric func() という関数があったとします。

// UNITY //
public class box01Controller : MonoBehaviour
{
    void Start()
    {
      
    }
    public void func(int dig){
        // 関数の中身は自由
        transform.eulerAngles = new Vector3(dig, 0, 0);
    }
}

それを、gameDirectorというオブジェクトに張り付けた、gameDirector.cs というスクリプトからfunc()を実行するには、以下のようにします。

// UNITY //
public class gameDirector : MonoBehaviour
{
    GameObject box01;

    void Start()
    {
        this.box01 = GameObject.Find("box01");
    }

    void Update()
    {
        // zを押したら、func を実行
        if(Input.GetKey(KeyCode.Z)){
            this.box01.GetComponent().func(90);
        }
    }
}

衝突判定

Collider を付けたオブジェクトがぶつかると、OnTriggerEnterという関数が呼ばれます。otherには相手のCollider が入ります。

// UNITY //
void OnTriggerEnter(Collider other){
    //衝突処理
    Destroy(other.gameObject); // 衝突してきたものを消す場合
}

何とぶつかったかタグで判定(タグは前もって登録しておきます)。

// UNITY //
void OnTriggerEnter(Collider other){
    if(other.gameObject.tag == "myBox"){
        //衝突処理
    }
}

クローンとPrefab

prefabがクローンに対応しています。

// UNITY //
public GameObject boxPrefab; // Prefabの入れ物を作っておく

--
Instantiate(boxPrefab); // このコードでPrefabが生成される
GameObject item = Instantiate(boxPrefab) as Game // Prefab をGameObjectとして扱いたい場合

Prefabを前もって作っていて、このscriptに登録する必要があります。

その他

それ以外でも、対応付けられそうなものはありそうです。

Scratch→Unity の順番として、

音 → AudioSourceコンポーネント
コスチューム → Material, Mecanim

などでしょうか。