【Unity】スクリプトから大きさを変更する

  「【Unity】スクリプトから位置座標を変更する」とほぼ同じだがscale【スケール】ではなくlocalScale【ローカルスケール】を使う点に注意。
 手順は大きく以下3つ。
①仮の変数に今の座標取得
②仮の変数の値を変更
③オブジェクトの座標に仮の変数を代入

 代入という言葉がわからない場合は「【C#】代入のはなし」を参照。またVector3【ベクタースリー】という言葉がわからない場合は「【Unity】Vector3がざっくりわかるはなし」を参照。さらにTransform【トランスフォーム】コンポーネントについては「【Unity】位置、回転、大きさを変える」も参照しておくことを推奨。

Vector3 kero = new Vector3(1, 1, 1);  //①仮の変数宣言&初期化
kero.x = 2;                           //②変数keroのx座標を2に書き換え
gameObject.transform.localScale = kero; //③位置座標に変数keroを代入

 本来スクリプトからコンポーネントの変数にアクセスするときは同じオブジェクトであってもコンポーネントの指定や取得をしておく必要があるが、Transformは基本的にどのオブジェクトにも標準搭載なので省略できる。

 よくある落とし穴のポイントとして以下のように直接localScale【ローカルスケール】の座標を変更したくなるが、これはできない仕様。Vector3で代入できるので仮のVector3型変数を作っている。

//エラーになるパターン
gameObject.transform.localScale.x = 1;

 また、勘のいい方ならscaleを使うと思ってしまうが、localScaleを利用する。これはオブジェクトを子オブジェクトとして設定した際親オブジェクトに連動してサイズが変わるため、全体から見たサイズ情報とオブジェクト自身が持つサイズ情報を区別するためにあると思われる。

【Unity】スクリプトから回転・姿勢を変更する

 「【Unity】スクリプトから位置座標を変更する」とほぼ同じだがrotation【ローテーション】ではなくeulerAngles【オイラーアングルズ】を使うことに注意。
 手順は大きく以下3つ。
①仮の変数に今の座標取得
②仮の変数の値を変更
③オブジェクトの座標に仮の変数を代入

 代入という言葉がわからない場合は「【C#】代入のはなし」を参照。またVector3【ベクタースリー】という言葉がわからない場合は「【Unity】Vector3がざっくりわかるはなし」を参照。さらにTransform【トランスフォーム】コンポーネントについては「【Unity】位置、回転、大きさを変える」も参照しておくことを推奨。

Vector3 kero = new Vector3();  //①仮の変数宣言&初期化
kero.x = 1;                           //②変数keroのx座標を1に書き換え
gameObject.transform.eulerAngles = kero; //③位置座標に変数keroを代入

 本来スクリプトからコンポーネントの変数にアクセスするときは同じオブジェクトであってもコンポーネントの指定や取得をしておく必要があるが、Transformは基本的にどのオブジェクトにも標準搭載なので省略できる。

 よくある落とし穴のポイントとして以下のように直接eulerAnglesの座標を変更したくなるが、これはできない仕様。Vector3で代入できるので仮のVector3型変数を作っている。

//エラーになるパターン
gameObject.transform.eulerAngles.x = 1;

 また、勘のいい方はrotationで動かせるかと思ってしまうがこれもエラー。transform.rotationはVector3ではなくQuaternion【クオータニオン】という型で保存されている。普段私達が使っているオイラー角で代入するためにはeulerAnglesを指定すればよい。

【Unity】スクリプトから位置座標を変更する

 手順は大きく以下3つ。
①仮の変数に今の座標取得
②仮の変数の値を変更
③オブジェクトの座標に仮の変数を代入

 代入という言葉がわからない場合は「【C#】代入のはなし」を参照。またVector3【ベクタースリー】という言葉がわからない場合は「【Unity】Vector3がざっくりわかるはなし」を参照。さらにTransform【トランスフォーム】コンポーネントについては「【Unity】位置、回転、大きさを変える」も参照しておくことを推奨。

Vector3 kero = new Vector3(0, 0, 0);  //①仮の変数宣言&初期化
kero.x = 1;                           //②変数keroのx座標を1に書き換え
gameObject.transform.position = kero; //③位置座標に変数keroを代入

 本来スクリプトからコンポーネントの変数にアクセスするときは同じオブジェクトであってもコンポーネントの指定や取得をしておく必要があるが、Transformは基本的にどのオブジェクトにも標準搭載なので省略できる。

 よくある落とし穴のポイントとして以下のように直接position【ポジション】の座標を変更したくなるが、これはできない仕様。Vector3で代入できるので仮のVector3型変数を作っている。

//エラーになるパターン
gameObject.transform.position.x = 1;

【C#】代入のはなし

 プログラムをソースコードで書き始めて違和感のあるポイントの1つ、イコール記号”=”についての記事です。
 ”=”自体は算数や数学で見慣れた記号ですがプログラムではそもそも別物です。ニュアンス的に共通する部分もありますがそもそも別物として学びなおしたほうがむしろわかりやすいかと思います。尚、これは”代入“という変数の操作ですので先に「変数がざっくりわかるはなし」をご一読いただければと思います。

 算数や数学での”=”は等価を表します。等価というのは”=”の右と左が同じという意味です。特に算数では”計算式=計算結果”という使い方がメインだと思います。

 一方でプログラム(この記事ではC#)での”=”は代入という操作を意味します。
  「変数がざっくりわかるはなし」 と同様にコップを例に出して話を進めると、コップに入れておく水の量を変える操作です。例えば空のコップaがあるとして

a = 50;

のような記述のイメージは下の図のようになります。

 他にもいくつか例を並べてみましょう。

 あまり実感が湧きづらいかとは思いますが要は代入とは
「コップの中を今から言う量にしてくれ」
という命令です。

 つまり量を明確に指定する必要があります。「50にしてくれ」「20と30を足した量にしてくれ」「あっちのコップbと10を足した量にしてくれ」といった具合です。
 指定した量だけ注ぎ足したり捨てたりしたいときは最後の例のように「今のコップaから20だけ引いた量にしてくれ」という表現になります。量の計算にそのコップ自身も使えるわけですね。

 いかがでしたか?始めは記号からイメージがしづらいですが慣れてしまえばそれほど難しいものではありません。序盤にも書きましたがとりあえず算数の”=”と別物と思って使っていればすぐにマスターできると思います。