以下は、Unityを始めて利用する人のためのUnityのMaterialを体験する資料の続きとして作られています。
Unity用で使うプログラミング言語は、下記メニューで示すように様々ありますが、以下ではC#を使った例です。
この編集用のデフォルトエディタは、デフォルトが「MonoDevelop」と呼ばれるものになっていますが、
C#を使う場合に入力のアシストをしてくれる「Visual Studio」に変更している例です。
(「Visual Studio」を有効に使う場合、それを別途にインストールする必要があります。)
この変更は、お好みで使いやすいものを選べばよいでしょう。
下のイメージのように、「Asset」メニューの「Create」から、「C# Script」を選択します。
Assetメニュー、 生成できるAsset、 Unity Preference、 Consoleビュー
Assetメニュー:作品に必要なリソースであるAssetsフォルダに対するメニュー
生成できるAsset:「Asset」メニューのCreateで出るメニューで、C#言語のスクリプトの選択している画面です。
Unity Preference:「Edit」メニューの「Preference...」を選択すると出るダイアログで、 スクリプトの編集ツールの変更している場面です。
Consoleビュー:実行時の情報を表示します。 スクリプトをデバックする場合によく使います。(デフォルト位置では、AssetsがあるProjectタブと並んで切り替えできます。)
上記操作の「C# Script」追加で、次のように「Assets」の中に[NewBehaviorScript]ができます。
このようなスクリプトは、「Hierarch」内のGameオブジェクトに設定して使うので、
ここでは、[Sphere]に設定することを前提に、[NewBehaviorScript]を[SphereScript]に
名前を変更します。(選択後に[NewBehaviorScript]の名前文字部をクリックすると編集できます。)

上のイメージのように[Sphere]へスクリプトをドラックします。すると次のメッセージがでるでしょう。
「スクリプトクラスが見つからないため、スクリプトコンポーネント 'SphereScript'を追加できません。
コンパイルエラーとファイル名とクラス名のパスがないことを確認してください。」の意味です。
つまり、スクリプトにエラーがある状態で、この操作できないということです。
実は、ファイル名を変更した場合、クラス名も同じように変更しなければならないことになっています。
そこで、「Asset」のスクリプトのアイコンを右クリックして、「open」を選択してエディタを起動し、
次のようにクラスの名前も変更し、保存後に再び[Sphere]へドラックします。
このように「Hierarch」内のGameオブジェクトにドラックする処理は、スクリプトをgameObjectに結び付けることをアタッチすると呼ぶ。
(なお、エディタはこのページ先頭で示したように、お気に入りのものへ変更できます)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShpereScript : MonoBehaviour {
// Use this for initialization
void Start () {//起動時に一回だけ呼び出され、一般にアタッチしたオブジェクトの初期化用の記述を行いまうす。
}
// Update is called once per frame
void Update () {// フレーム更新ごとに1回呼ばれる。ゲームなどの進行処理は、一般にここへ記述します。
}
}
上記の意味を、日本語のコメントで追加しました。
public class SphereScript : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
Vector3 position = Input.mousePosition;// Vector3でマウス位置座標を取得する(スクリーン座標)
position.z = 10f;// Z軸修正
// スクリーン座標をワールド座標に変換した位置を取得
Vector3 worldPosition = Camera.main.ScreenToWorldPoint(position);
// ワールド座標に変換されたマウス座標で、これがアタッチされる[Sphere]位置を変更
this.gameObject.transform.position = worldPosition;
print ("position,worldPosition:" + position + "," + worldPosition );//確認用で、Consoleに表示
}
}
以下が、実行画面です。
すぐ上に表示している"position,worldPosition:(255,107,0),(-0.3,-1.2,0.0)"は、print命令で得られる表示で、値の確認のために使っています。
ここには、スクリプトのコンパイルエラーや、実行エラーも表示されます。(エラー時は赤の文字色になる。)
そして、この表示履歴が「Console」ビューに記録されます。
上記の表示内容は、マウスのスクリーン座標とGameビュー内の座標(ワールド座標と呼ぶ)で、各(x,y,z)です。
Updateの更新処理の繰り返しで、スクリーン座標を取得し、それでワールド座標を求めて、それで[Sphere]位置を変更しています。
[Sphere]の設定は、this.gameObject.transform.position への代入で行っていますが、this.gameObjectが
このスクリプトをアタッチした、「Hierarch」内のGameオブジェクトで、 ここでは、[Sphere]と言うわけです。
代入情報はワールド座標を記憶している「Vector3」型の変数 worldPosition で、(x,y,z)の情報のまとまりです。
なお、フレームの更新ごとに、マウスのスクリーン座標からワールド座標に変換した後、[position.z = 10f;// Z軸修正]を行っていますが、
スクリーン座標には、奥行の情報がないので、ちょうど見栄えがよい位置にz軸の位置を設定しています。
なお、座標系には、他に特定のオブジェクトのローカル座標を扱うことがあります。その変換例を以下に示します。
これを、前述スクリプトにコピー、貼り付けして実験するとよいでしょう。
//ワールド座標を特定のオブジェクトのローカル座標に変換
Vector2 localPos = transform.InverseTransformPoint (worldPosition);
print ("localPos:" + localPos );
//その逆でローカル座標からワールド座標に変換
worldPosition = transform.TransformPoint (localPos);
print ("worldPosition:" + worldPosition );