2016年7月17日日曜日

Unity学習Part2~Script編~

Unity学習を初めてそろそろ1ヶ月。

感想として、



とにかく楽でおもしろい!


libGDXに比べて、ゲーム作りに必要な便利グッツがなんでも用意されている。

こんなに裕福な家庭でぬるま湯に浸かってていいのか、と思うぐらい。

しかも、ゲーム作りがゲーム感覚で作れてしまうのがまたいい。

ガリガリコード書いて自分でロジック作り上げるのも楽しいけど、

Unity触ってしまうともうもとには戻れない気がする、、、



さて、せっかく勉強しているのでスクリプトの部分で勉強になったこともまとめておく。




<スクリプト編>

①キーの入力取得

 ・vector.x = Input.GetAxis("Horizontal") 左右カーソルキー(-1~1)

 ・vector.y = Input.GetAxis("Vertical")   上下カーソルキー(-1~1)

  Input.GetKey("z")                               zキー

  ・Input.GetButtonDown("Fire1")      画面タップやマウスのクリックを検知

 ※Fire1やHorizontalなどはInputManagerに事前設定されている入力名称
       Editメニュー → Project Settings → Input → Input Manager


②加速度センサー入力取得

 vector.x = Input.acceleration.x


③エディターと実機で処理を分ける

 ・if(Application.isEditor) {
         エディター処理
     } else {
   実機処理
     }

④接触検知

 ・OnTirggerEnter コライダ-にオブジェクトが入った

 ・OnTriggerExit   コライダ-からオブジェクトが外れた

 ・OnTriggerStay オブジェクト同士が接触している間、毎フレーム呼ばれる


⑤オブジェクトへ力を加える

 ・AddForce(direction * r.mass * 20.0f)
  ※directionは方向ベクトル


⑥ゲームがスタートしてからの秒数をfloat値で取得

 ・Time.time


⑦オブジェクトの位置に加算

 ・transform.Translate(100, 0, 0)
  x方向に100加算

 注:transform.position.x = 100 のように直接値を変更できない

 仮の変数にコピーする方法
 
 Vector3 pos = transform.position;
 pos.y = 100;
 transform.position = pos;


⑧Debugクラス

 ・Debug.Log関数   関数に渡した文字列とその場所のスタックトレースをConsoleビューで確認できる

 ・Debug.Break関数  呼び出されたタイミングでUnityプレビューを一時停止する



⑨プレファブからオブジェクトを動的に生成

 ・GameObject obj = (GameObject)Instantiate(プレファブ,位置,向き);


⑩Transformコンポーネントのforwardパラメータ

 ・Transform.forward  そのオブジェクトが向いている方向を取得


⑪RigidBody.AddTorque

 ・回転する力を加える

 RigidBody.AddTorque(new Vector3(0, 10, 0))
 y軸に10の力、すなわち水平に回転


⑫ランダム値取得

 ・Random.Range(0, 10) 0~10のランダム値取得


クリックもしくはタップした位置を取得

 ・Input.mousePosition 


⑭親オブジェクトの設定

 ・obj.transform.parent = parentobj.transform


⑮オブジェクト削除

 ・Destroy(obj)

 ※ゲームオブジェクトだけでなくオブジェクトにアタッチされたコンポーネントに対しても有効



⑯疑似マルチスレッドのコルーチン

 ・あたかも並列処理しているかのように動作させることが出来る。
  疑似マルチスレッドのようなもの。

  ・コルーチンを開始させる関数
   StartCoroutine(コルーチン型)  

  ・コルーチンを定義
  IEnumerator コルーチン () {
   yield return new WaitForSeconds(1.0f); ←
   処理内容
  }
   ※WaitForSeconds(1.0f) 引数で指定した秒数が経過するまでその場でフレームをスキップ


⑰LateUpdate関数

 ・すべてのUpdate関数の処理が終わった後に処理される


⑱線形補間関数でスムージング

 ・Vector3.Lerp(現在のポジション,目標のポジション,一定の割合で距離を縮める)


⑲オブジェクトの表示非表示

 ・obj.SetActive(false)  非表示になる


⑳シーンの切り替え

 ・using UnityEngine.SceneManagementを追加

 ・SceneManager.LoadScene("sceneName");

  ※Unity5.3でApplication.LoadLevel("sceneName")は非推奨になったらしい

 ・File → Build Settings → Scene In Buildリストへシーンファイルを追加しておく
  追加したいシーンを編集画面に表示した状態でBuild Settingsを開きAdd Currentボタンを押す
 
  ※一番上に設定したシーンが起動時の最初のシーンとなるのでTitleシーンを一番最初に追加


㉑enableフラグ

 ・enabled = false;

  そのコンポーネントの機能を停止(Updateを止める)する
  ※Inspectorビュー上のコンポーネント名の左側のチェックボックスと紐づいている


㉒Invoke関数で時間差処理

 ・指定秒数後に指定メソッドを呼び出す

  Invoke("method", 2.0f);

㉓簡易的なデータ保存

 ・PlayerPrefs.GetInt(”HighScore”)  HighScoreラベルの値をInt型で読込

 ・PlayerPrefs.SetInt(”HighScore”)  HighScoreラベルの値をInt型で保存


㉔SendMessageでみんなに知らせる

 ・同オブジェクトに追加されているコンポーネントにイベントを通知する

  SendMessage(”イベント名”, オプション指定);

 ※オプションにSendMessageOptions.DontRequireReceiverを指定することでメッセージを送った先にメソッドがなくてもエラーを出力しない


㉕Awake関数で一番乗り

 ・オブジェクトが生成された瞬間に呼ばれる為、コンポーネントの取得をすべてのオブジェクトのStart関数より早く行える

 ※Start関数はオブジェクトが生成後、初めてのフレーム前で呼ばれる為、厳密にはロスが生じる

 ※Awake関数内で他オブジェクトを操作するコードを書くとNull参照が起こる可能性があるので注意


㉖Main Cameraを参照する

 ・Main Cameraオブジェクトには、デフォルトでMain Cameraタグが設定されている為、以下コードで参照が出来る

  Camera.main.メソッド


㉗複数のAudioSourceを扱う

 ・エフェクトなどを鳴らす場合はAudioSourceコンポーネントを追加してAudio Clipパラメータへデータをセットするのだが、AudioSourceコンポーネントには一つのAudioClipしか設定できない為、複数のエフェクトを扱う場合は複数のAudioSourceコンポーネントを追加することになる。
複数のAudioSourceコンポーネントをScriptで扱うには以下のようにする


    //メンバ変数
    AudioSource jumpSound;

    AudioSource breakSound;
    AudioSource[] audioSources;

    void Start ()
    {
        //配列としてオーディオソース取得
        audioSources = GetComponents<AudioSource>();
   //※GetComponentではなく後ろにsを付ける
        jumpSound = audioSources[0]; 
        breakSound = audioSources[1]; 
   //※AudioSourceを追加した順番に配列に格納される
    }

    //ジャンプボタンが押されたらジャンプ処理実行
    void jump ()
    {
        //サウンド再生
        jumpSound.Play();

    }


    //何かに衝突したら死亡処理
    void OnCollisionEnter2D (Collision2D collision)
    {
        //サウンド再生
        breakSound.Play();

    }


㉘最大値と最小値をさくっと管理

 ・value = Mathf.Clamp(value, min, max);

  たったこの一文で指定範囲を超えたら最大値、最小値で補正してくれる優れもの!


㉙円で指定した半径の中だけで移動させる

 ・ pkayer : キャラクター
  center : 円の中心
  radius : 半径

  Vector3 dist = player.position - center.transform.position;
    dist = Vector3.ClampMagnitude(dist, radius);
    player.transform.position = center.transform.position + dist;

  ClampMagnitudeでベクトル間距離が指定した最大値以上にならないように管理






<あとがき>
Unity&C#初心者なもので、一冊読み終わるころには項目数が結構伸びてしまった、、、
思ったよりも便利な関数がたくさんあり、さすがC#、いやUnityのおかげかな。



0 件のコメント:

コメントを投稿