「授業用」カテゴリーアーカイブ

単眼VR用スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class gyroCam : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Input.gyro.enabled = true;
	}
	
	// 横位置用
	void Update () {
		transform.rotation = Quaternion.AngleAxis(90.0f,Vector3.right)*Input.gyro.attitude*Quaternion.AngleAxis(180.0f,Vector3.forward);
	}
}

スマートホンのジャイロに応じてカメラが移動します.Androidはジャイロが搭載されていない機種も多いので使えないこともあります.

動作例

ゲームオブジェクトを巡回させる(AI無し)

スクリプトがアサインされたゲームオブジェクトを毎回決まったルートを巡回させます.

下のスクリプトをPatrol.csとして保存しUnityに読み込みます.

using UnityEngine;
using System.Collections;

public class Patrol : MonoBehaviour
{

    [SerializeField, TooltipAttribute("経由地点の数を入力し,シーン上に配置した空のオブジェクトをアサインします")]
    public Transform[] wayPoints;

    public Transform target;
    public float speed;

    public int currentRoot;


    void Update()
    {

        //配列に入れたTransformを順に巡る.AIを使っていればスムーズに曲がるがこれは鋭角に曲がる

        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, wayPoints[currentRoot].position, step);


        Vector3 pos = wayPoints[currentRoot].position;

        float test = Vector3.Distance(target.position, pos);
        transform.LookAt(pos);
                    
        if(Vector3.Distance(transform.position, pos) < 0.5f)
        {
          currentRoot = (currentRoot < wayPoints.Length - 1) ? currentRoot + 1 : 0;
        }

    }
}

シーン内に巡回するGameObjectを配置します.

図ではCubeを選択しています

このGameObjectにPatrol.csをアサインします.

Sizeは巡回箇所の数で,ここに数字を入れると下に入力フィールドが現れます.Speedには適当な数字を入れておきます.

Elementには GameObject>CreateEmptyで作成した空のオブジェクト(位置情報のみ)を配置いれます.

これで再生すると,Patrol.csをアサインしたGameObjectがWayPointsを巡回するようになります.

キャラクタにモーションを追加する

コントロールオブジェクトを選択し、Sキーでキーフレームを設定し、アニメーションを作成する。

まずはアイドリングのアニメーションを作成する。およそ2〜3秒で1回のアニメーションとすること。

この他に「歩く」「走る」の基本モーションと、ゲームの内容に応じて、「驚く」「伏せる」「怒る」「襲う」などを作成すること。アニメーションについては、グラフエディタなどを使いループ時のつなぎ目が無いように設定すること。

増分保存することで、リセットできるようにしておくこと。

アニメーションが設定できたら、編集>キー>シミュレーションのベイク処理 を実施する。設定は以下画像を参考に。

その後、ファイル>すべて書き出し>□

プリセットを編集>アニメーションをベイク処理>アニメーションをベイク処理にチェック をして書き出す。

Unity上でアニメーションが再生されます。この後、プログラムを使い、状況に応じて再生するアニメーションを変えることで、自分が操作しているように見せることができます。

キャラクターのウェイトを調整する

Mayaを使ってキャラクタのウェイト調整をおこないます

  1. まずデータを読み込みます
  2. この状態ではボーンが見えませんので,X線表示を選択します
  3. アウトライナでコンロトールオブジェクトを階層選択します
  4. メニューセットをアニメーションに変更,キーを打ち,復元ポイントを作成します
  5. コントロールオブジェクトを少し移動させ,破綻する場所を探します
  6. モデル上でマウスの 右プレス>スキンウェイトペイントツールを選択
  7. 適宜調整する
  8. あるボーンの影響力を弱めるのと,他のボーンの影響力を強めるなどバランス良くやってみるといい

シーン遷移の基本

シーン遷移の基本を学びます.

ここでは,トップ画面>ゲーム画面>エンド画面の3つのシーンを移動しまたトップ画面へ戻ります.

 

ワークフロー

  • シーンを作成
  • ボタンを作成
  • スクリプトを作成
  • ボタンにスクリプトをアサイン
  • ビルド設定をする
  • 実行する

 

トップシーンを作成する

  1. トップ画面用シーンを作成する
  2. トップ画面用シーンに適宜UI>Textを入れて遷移時にどの画面にいるか分かるようにする
  3. トップ画面にGameObject>UI>Buttonでボタンを作成する
  4. 位置調整をする(参考画像)

 

スクリプト作成

  1. scnChangeというファイル名でスクリプトを作成する(※ファイル名とclass名は同一にすること)
  2. 全て以下に入れ替え保存する(※このスクリプトは他でも使い回しできます)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.SceneManagement;//これを必ず追加しないと使えない


public class scnChange : MonoBehaviour {

    public string scnName;//変数scnNameをInspectorからセットできるようにする
	
	
    public void goScene(){
        SceneManager.LoadScene(scnName);//変数scnNameのシーンにシーン遷移する
    }

}

 

スクリプトをボタンにアサインする

  1. GameObject>CreateEmpty で空のオブジェクトに上で作成したスクリプトをコンポーネントに追加する
  2. Scn Nameの欄にジャンプ先のシーン名を入力する(※これがInspectorに表示されるのは10行目の変数宣言をpublicにしているから)
  3. ボタンを選択し,OnClickの+ボタンでリストを追加する
  4. 追加したリストに作成した空のオブジェクト(1でスクリプトがついているもの)をアサインする
  5. NoFunctionのプルダウンからscnChange>goSceneを選択する(13行目のpublic void goScene を実行するという意味,publicがついているとボタンから押せる)

ビルド設定をおこなう

  1. File>Build Settings…でビルド設定を開き,ドラッグ&ドロップで,ここで作成した最初のシーンと,これまで作成しらゲームのシーンを追加する
  2. 保存し,トップ画面用シーンを再生し,ボタンを押してシーン遷移するか確認する
  3. シーン遷移後,ゲーム画面の明るさが少し暗いようでしたら,そのシーンのWindow>Lightingを選び,AutoGenerateのチェックを外し,Generateを一度押しておきます

 

実習

  • エンドシーンを作成する
  • ゲームシーンからエンドシーンエンドシーンからトップシーンへとジャンプさせ3つのシーンを1周できるようにすること

Ultimate Joystick cam

ultimate joystick用スクリプト

// BEGIN MIT LICENSE BLOCK //
//
// Copyright (c) 2016 dskjal
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
//
// END MIT LICENSE BLOCK   //
using UnityEngine;

[RequireComponent(typeof(Camera))]
public class followCam3 : MonoBehaviour
{
    public Transform Target;
    public float DistanceToPlayerM = 2f;    // カメラとプレイヤーとの距離[m]
    public float SlideDistanceM = 0f;       // カメラを横にスライドさせる;プラスの時右へ,マイナスの時左へ[m]
    public float HeightM = 1.2f;            // 注視点の高さ[m]
    public float RotationSensitivity = 100f;// 感度
    public float limitMax = 0.4f;
    public float limitMin = -0.4f;

    void Start()
    {
        if (Target == null)
        {
            Debug.LogError("ターゲットが設定されていない");
            Application.Quit();
        }
    }

    void FixedUpdate()
    {


       // var rotX = Input.GetAxis("Mouse X") * Time.deltaTime * RotationSensitivity;
       // var rotY = Input.GetAxis("Mouse Y") * Time.deltaTime * RotationSensitivity;

        float rotX = UltimateJoystick.GetHorizontalAxis("camStick")* Time.deltaTime * RotationSensitivity;
        float rotY = UltimateJoystick.GetVerticalAxis("camStick")* Time.deltaTime * RotationSensitivity;

        var lookAt = Target.position + Vector3.up * HeightM;

        // 回転
        transform.RotateAround(lookAt, Vector3.up, rotX);
        // カメラがプレイヤーの真上や真下にあるときにそれ以上回転させないようにする
        if (transform.forward.y > limitMax && rotY < 0)//default 0.9
        {
            rotY = 0;
        }
        if (transform.forward.y < limitMin && rotY > 0)
        {
            rotY = 0;
        }
        transform.RotateAround(lookAt, transform.right, rotY);

        // カメラとプレイヤーとの間の距離を調整
        transform.position = lookAt - transform.forward * DistanceToPlayerM;

        // 注視点の設定
        transform.LookAt(lookAt);

        // カメラを横にずらして中央を開ける
        transform.position = transform.position + transform.right * SlideDistanceM;
    }
}

 

参考サイト

https://dskjal.com/unity/tps-camera.html

コインドーザーの作成3

つづきです

 

次にボタンを押すとコインが落ちる仕組みを作成する

まず,

  1. GameObject>UI>Button でボタンを作成する
  2. ゲーム画面にボタンが表示される
  3. ヒエラルキーで作成されたボタンを選択する
  4. ボタンの位置調整をする.まず,右上を基準モードにする(画像1,2の順に選択)
  5. 次にゲーム画面を見ながら位置を調整し,画面の右端に移動させる(値は各自で自由に設定すること)
  6. GameObject>Create Emptyで空のオブジェクト(位置情報のみのオブジェクトになる)を作成する.後でこの位置からコインを生成させるための準備
  7. 名前はに変更しておくこと
  8. 参考の位置
  9. Asset内で右クリック>Create>C# Scriptを作成し,名前をcoin_genにする
  10. coin_genを開きスクリプトエディタ(Visual Studio等)を開き中身を以下に入れ替える

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine; 

public class coin_gen : MonoBehaviour { 
public Transform spawnpos;//インスペクタに位置情報用のドロップボックスを表示 
public GameObject coninPrefab;//プレファブをアサインするドロップボックスを表示 

void Start () { }
 
// Update is called once per frame 
void Update () { } 


//public化することでボタンからクリックで実行きるようになる 
public void genBtn(){
 Vector3 pos = spawnpos.transform.position;//spawnposの位置をvector3形式にし,posに入れる 
Instantiate(coninPrefab, pos, Quaternion.identity);//coninPrefabを生成させる
 } 
}

 


  1. 再度空のオブジェクトを作成し,名前をscriptに変更する
  2. 作成したcoin_genをscriptにアサインする
  3. インスペクタに表示されたspawnposにspawnPointをアサインする
  4. (下図を確認)
  5. HierarchyにあるcoinをAssetsにドロップする. coinがPrefab化(青い色に変わる)する.Hierarchyのcoinはこの段階で取り除く
  6. ヒエラルキーにscriptを選択し,coinPreをCoinPrefabをにアサインする
  7. ゲームを再生し,ボタンを押しコインが落ちてくるのを確認する

 

時間があればさらに改造してみましょう.

 

追記(2018/10/12)

落ちてきたコインを消すスクリプト.コライダにアタッチする.ファイル名はdestroy.csとする.

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class destroy : MonoBehaviour { 

public void OnTriggerEnter(Collider other){ Destroy(other.gameObject); } 

}

 

追記(2019/12/03)

move-blockがコインで弾かれる方は以下の設定をする

(A)move-block>RigidBody>Constrain のFreeze PositionをZ以外に全てチェックを入れる

(B)Coin(Prefab)のRigidBodyのMassをなるべく軽くする(0.05 kg)など