「Unity」カテゴリーアーカイブ

Unity勉強会1

Unity勉強会の内容を転記

  1. 本日,Unity5リリース.1日目(インストールし起動確認済みとの前提で)
    ・ソフトウェアの起動,終了
    ・ソフトウェアのUI説明
    ・ゲームの実行
    ・プロジェクトの作成
    New Projectを作成,.packageの読み込み,2Dモード3Dモード選択
    ・アセットストアの使い方
    ・サンプルシーンの説明
    ・サンプルシーンのビルドなど
  2. 簡単なページ遷移の作成
    1. デスクトップをデフォルトに(その後好きなの選べ)
    2. AssetsフォルダはプロジェクトのAssetsフォルダのこと.フォルダ,ファイルの作成はここでもできる(これ超便利)
    3. 他のAssetsとの名前の差別化が必要 mySceneとかmyMaterialとmyをつける方法,全部大文字でPREFABにするなど各自スタイル決めて
    4. フォルダ作成してmySceneかSCENEと名前つける
    5. そのフォルダ内にシーンを保存
    6. GameObject>UI>Buttonでボタン作成(※このUIはuGUIを呼ばれver4.6から搭載)
    7. 位置を調整し,色をカスタマイズ
    8. 1stSceneという名前で保存,また新規シーン作成し,2ndSceneという名前で保存(シーンを2つ作る)
    9. 1stSceneを開く
    10. 自作スクリプト保存用フォルダ作成 ex. myScript
    11. C#スクリプトを作成,スクリプト名はloadlevel1
    12. void update{}の下に以下3行を追加
(黄色い部分)
using UnityEngine;
using System.Collections;

public class loadlevel1 : MonoBehaviour {

	// Use this for initialization
	void Start () {
	//ここは起動時に1回実行
	}
	
	// Update is called once per frame
	void Update () {
	//ここは毎フレーム実行
	}

	public void OnClick() {
		Application.LoadLevel ("2ndScene");
	}
}
  1.  Buttonにこのスクリプトをアサイン(アサイン方法は2通りある)
  2. ◎ボタンをクリックし,このボタンオブジェクトを選択,右のfunctionの中からloadlevel1のonClickを選択
  3. 再生ボタンで実行>失敗するはずです
  4. 保存して,File>Builsettingsを開きAddCurrentをクリック,次に2ndSceneを開き,またAddCurrent,また1stSceneを開き,ゲーム実行する.
  5. 今度は2ndSceneが開けたはずです.
  6. 複数あるシーン(レベルと考えてもかまわない)をBuildSettingsに予め登録しておくことが必要.(重要)
  7. ビルドすると,アプリが作成される
  8. 余裕があれば2ndSceneにボタンとスクリプトを追加し,往復できるアプリにする
  9. さらに余裕があれば,スクリプトが1つで済むようにシーン名で判断させる
ヒント
  10. 
if (Application.loadedLevelName == "2ndScene") {

     //ここに何をいれるといい?
    
}

     

UnityでARアプリ

UniyにVuforiaを入れてARアプリ.
簡単に作成できますが問題が.

Prefabでオブジェクトを作成(instantiate使って)したときに,ARマーカー非認識時でも隠したい見えちゃう問題です.

解決法.staticなブールを置いて,状態をチェックする.

(1)原因のおそらく
Vuforiaのスクリプトは子オブジェクトまでを配列に読み込んでrenderをON/OFFさせるが,prefabの2個目以降が入ってこない.タイミングの問題か,同じ名前だから1つ目以外は無視されているか.

(2)解決方法
いろいろ試したが,強引にやることに.

DefaultTrackableEventHandlerに以下を追加

public static bool meshVisi = false;

コード(抜粋)黄色の部分を追加

public class DefaultTrackableEventHandler : MonoBehaviour,
                                            ITrackableEventHandler
{
    #region PRIVATE_MEMBER_VARIABLES
 
    private TrackableBehaviour mTrackableBehaviour;
    
    #endregion // PRIVATE_MEMBER_VARIABLES



    #region UNTIY_MONOBEHAVIOUR_METHODS
	//
	public static bool meshVisi = false;
	/// 


    
    void Start()
    {

次に,同じくDefaultTrackableEventHandlerに以下を追加.(70行目前後にあり)

マーカーを発見したとき用 黄色の部分だけを追加

  private void OnTrackingFound()
    {
		meshVisi = true;//bird mesh renderer-on

        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
        Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

 

マーカーを見失ったとき用(100行目くらい) 黄色の部分だけを追加

    private void OnTrackingLost()
    {
        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
        Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

		meshVisi = false;//bird mesh renderer-off

 

(3)プレファブのメッシュに追加するスクリプト

using UnityEngine;
using System.Collections;

public class renderVisi : MonoBehaviour {
	
	void Start () {
		renderer.enabled = false;

	}

	void Update () {
		if(DefaultTrackableEventHandler.meshVisi == true)
			renderer.enabled = true;
		if(DefaultTrackableEventHandler.meshVisi == false)
			renderer.enabled = false;

	}
}

これを renderVisiというc#で保存し,プレファブのメッシュにアサイン

 

(4)やってみる。

 

(5)

実行順とかでもクリアできそうな強引なスクリプトが目立ちますが,,ご容赦.

納期が近いので、、

UnityでARアプリ作成

(1)Unityをインストール
http://japan.unity3d.com/

(2)VuforiaのUnityPackageをダウンロード

https://developer.vuforia.com/
へ行き,Downloadをクリック

Unity Extensionを選択してDL

Unity側でImport PackageのCustom Packageで入れる

(細々とした使い方をここにかく予定)

・マーカーは
https://developer.vuforia.com/
へ行きアップロードし.サーバで作られたマーカー用のUnityPackageをDL

・ノートPCでもテスト可能(MacBookは単体でチェック可能)
そのままAndroidビルドおK

簡単でした.
マーカーをけっこう選びます

Unity-ローディング画面

数字だけですが,,この数字をGUIに適用すれば棒グラフ作れますね.

var percentageLoaded : float = 0;

function Update() {
    if(Application.GetStreamProgressForLevel("読み込みたいシーン名") == 1) {
        guiText.text = "ゲームの準備完了!!";
    } else {
        percentageLoaded = Application.GetStreamProgressForLevel("読み込みたいシーン名") * 100;
        guiText.text = percentageLoaded.ToString() + "%読み込みました"; 
    }
}

 

Unity-スピード検出

スピードを検出します.キャラクタコントローラがアサインされていることが必須です.

それと同じオブジェクトにアサインしてください.

#pragma strict

static var horizontalSpeed : float = 0.0;

function Start () {

}

function Update () {
    var controller : CharacterController = GetComponent(CharacterController);
    var horizontalVelocity : Vector3 = controller.velocity;
    horizontalVelocity = Vector3(controller.velocity.x, 0, controller.velocity.z);
    
    // The speed on the x-z plane ignoring any speed 
    horizontalSpeed = horizontalVelocity.magnitude;

   
  //print(horizontalSpeed);
  Debug.Log(horizontalSpeed);
}

 

Unity-カメラの切り替え

ボタンを2つ用意してカメラを切り替えます

スクリプトを適用した後,カメラをアサインしてください.

var cameraA : GameObject;
var cameraB : GameObject;
cameraA.camera.enabled = true;
cameraB.camera.enabled = false;
 function OnGUI () {
// background box
GUI.Box (Rect (Screen.width -110,10,100,90), "Cam Type");
// first button
if (GUI.Button (Rect (Screen.width -100,40,80,20), "RGB CAM")) {
cameraA.camera.enabled = true;
cameraB.camera.enabled = false;
  }

// second button.
if (GUI.Button (Rect (Screen.width -100,70,80,20), "Move CAM")) {
cameraA.camera.enabled = false;
cameraB.camera.enabled = true;
  }
}

 

Unity-GUI Layout

どうやらUnityのGUIは普通のGUIとGUI Layoutというものがあります.GUI-Skinを適用すると大きさや書体やデザインを自由に変えられます.これ,cssのようなものとおもってください.

それはともかく,GUIです.

var hSliderValue : int = 0;
var akairo : float = 0.0;


function OnGUI () {
hSliderValue = GUI.HorizontalSlider (Rect (25, 25, 100, 30), hSliderValue, 0, 255);
akairo = hSliderValue / 256.0;
// slider value display
GUILayout.BeginArea (Rect (130,20,150,70));
GUILayout.BeginVertical();
GUILayout.Box("R(8bit=0-255): " + Mathf.Round(hSliderValue));
GUILayout.EndVertical();
GUILayout.EndArea();
}

function Update () {
light.color = Color(akairo, 0.0, 0.0);
}

GUILayout.BeginAreaから始まって,GUILayout.EndAreaで終わります.この2つで囲むことが重要です.

Unity-if文の基本

いや,HTML5と同じですが,,一応,,

var cubecount : int = 0;//Unityの変数宣言,コロンで型を指定しますよ
function Update () {
 if (cubecount < 9) {//もし9未満なら

   print(cubecount);//cubecountを表示せよ
   cubecount = cubecount+ 1;//一個増やす
 }
 else {//そうじゃやないなら
   print("end");//endを表示
 }
 }

 

Unityークローンする

Unityで対象のオブジェクトを複製するJavaScriptです

//クローンする
var prefab : Transform;
for (var i : int = 0;i < 10; i++) {
Instantiate (prefab, Vector3(i * 1.1, 0, 0), Quaternion.identity);
}
//end clone script
function Update () {
}

Create EmptyしたGame Objectにスクリプトをアサインし,GUIからPrefabを指定してください.

実行すると10個複製します.

clone

Unity-他のスクリプトへメッセージ送信

C#なんてわしゃやらんよ,,けどちびっとかいてみる,,

Unityでの他のオブジェクトへメッセージを送る方法です

SendMessageというものをつかいます.

同じゲームオブジェクト内のスクリプトであれば,こんなことしなくても,関数名だけで動きますよ〜

またこのほかにfindで探させる方法もあります.この場合はタグをつけてあげるのもいいでしょう.また,BroadcastMessageというのもあります.

たぶんその面クリア!なんていうときに,「敵というタグ」のついたオブジェクト全部に一斉に自爆指令を放送してメッセージを送るとかに使うのかな?


本題です.

スクリプトは2つからなります

(1)受信側のスクリプト test1.cs

16行目にpublicがついています.これが必要なようです.

using UnityEngine;
using System.Collections;

public class test1 : MonoBehaviour {

	// Use this for initialization
	void Start () {

	}

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

	}

	public void neko(bool mybool){//publicで他からsendできます.メッセージがここで受信します.引数はブーリアンでmyboolに格納します
		Debug.Log(mybool);//myboolに格納されたブーリアンを出力します
	}
}

 (2)送信側のスクリプト  testzero.cs

これを実行すると画面にボタンが表示されます.

using UnityEngine;
using System.Collections;

public class testzero : MonoBehaviour {
	public GameObject player;//playerという名のゲームオブジェクトを指定します
//UnityのGUI側にゲームオブジェクトを選択できるGUIができますので,そこに受信側のスクリプトが含まれているゲームオブジェクトをアサインしてください.例えばCreate EmptyでスクリプトだけあてたゲームオブジェクトでもOKです

	// Use this for initialization
	void Start () {

	}
	void OnGUI() {

		if (GUI.Button(new Rect(10, 70, 50, 30), "Click"))//GUIボタン表示
		player.SendMessage("neko", true);//playerにアサインされたスクリプトのうち neko というクラスにアクセスし trueを引数で渡します
	}
	// Update is called once per frame
	void Update () {

	}
}

そのボタンをクリックするとコンソールにtrueと表示されます.

これ,Javascriptでは

function neko(mybool:bool){//引数の型の定義は不要だったかな?
//処理
}

 

では動作しません

static function neko(mybool:bool){
//処理
}

staticをつけると動きます.

どこかに書いてましたが static は「神の領域」らしいです.