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

Unity5でmic inputが反応しない件

micinputのサンプルがどれを試してもうまくいかない.

サンプルの記事ですと,コンソールにずっとゼロが表示されて音量が変化しません.

(最初に参考にさせていただいたスクリプト http://www.jonki.net/entry/20130607/1370622815 )

思い悩んで2日目,グーグルさんに1年以内の記事に限って検索するとその答えが載っていた.

まずはスクリプト(改変済み)

using UnityEngine;
using System.Collections;
//script source from web sample
//
public class micinput : MonoBehaviour {

	void Start()
	{

		//check
		foreach (string device in Microphone.devices) {
			Debug.Log("Name: " + device);
		}
		//
		GetComponent<AudioSource>().clip = Microphone.Start(null, true, 999, 44100);  // マイク入力
		GetComponent<AudioSource>().loop = true; // ループ再生にしておく
		//GetComponent<AudioSource>().mute = true; // Unity5ではコメントアウトうる
		while (!(Microphone.GetPosition("") > 0)){}             // マイクが使えるまで待つらしい
		GetComponent<AudioSource>().Play();                                           // 再生しないと音量をチェックできない
	}


	void Update()
	{
		float vol = GetAveragedVolume();
		print(vol);    
	}

	float GetAveragedVolume()
	{ 
		float[] data = new float[256];
		float a = 0;
		GetComponent<AudioSource>().GetOutputData(data,0);
		foreach(float s in data)
		{
			a += Mathf.Abs(s);
		}
		return a/256.0f;
	}


}

その対処方法

(ソース http://qiita.com/CST_negi/items/c8862f8d05dd9e871917 )

CreateEmptyで空のオブジェクトを作成

そこにスクリプトをアサインします

ミキサーの画面を呼び出し,[+]ボタンでミキサーを作成(ミキサなんてはじめてつこうたよ,,)micmixer

そのミキサのフェーダーを-80dbまで下げる(でないとハウリングおこしました)

micmixer2

上で空のオブジェクトに割り当てたたスクリプト(画面最下段の赤線)にAudio Sourceを割り当てます.

Outputに先ほど作成したミキサー(なぜかMasterと表示される)をアサインします

micmixer3

無事float値で取得できました

UGUIで画面サイズに合わせてUIの大きさを変える

iPhoneやAndroidや,スタンドアロンアプリを作成する際に,ユーザのスクリーンサイズはどんなサイズになるかわかりません.

iPhoneであればスクリーンの大きさのパタンが決まっていますが,Android端末は規格がばらばらです.

そこでUGUI(Unity4.6以降)のCanvasのルートにcanvas scalerを入れることで,画面サイズに大きさを固定できます,

(1)canvasを選んで

canvas1

(2)component>Layout>Canvas Scaler を追加

canvas2

(3)ゲーム画面を拡大すると,ボタンも拡大されます

 

canvas4

canvas3

Jsとcs間でのデータの受け渡し

JSとCS間ではいくらstaticが神の領域といえど,変数やクラスは呼び出せません.

とはいえ.いくつかの条件で橋渡しができます.

それにはいくつかのルールがあります.

(1)特定名のフォルダを作成し,呼ばれるスクリプトはそこに入れる

特定名のフォルダとは,Standard Assetsか,Pluginsとなります.ただ,Standard Assetsは,StandardAssetsパッケージを読み込んだ際に作られるフォルダとたぶん同名なので何かと不安.そこでPluginsフォルダを作成し,呼ばれるスクリプトはそこに入れる.

(2)必ずGameObjectにアサイン

呼ぶ側のスクリプト,呼ばれる側のスクリプトともになにかのGameObject(create emptyでもOK)にアサインする必要があります.以下の呼び出す側例はthis.○○を使っているので,同じGameObjectにアサインしています.試してはいませんが,find○○を使えば別の場所にアサインしていても呼び出せるのでは?

(3)呼ぶ側のスクリプトは特定フォルダ以外で

整理が面倒でも,呼び出す側のフォルダはPluginsフォルダ以外の場所に保存してください.なんだかエラーがでます.

スクリプト例

呼ばれる側

ーこのスクリプトはPluginsフォルダに入れる

#pragma strict
var neko : int = 100;
function Start () {
}

function Update () {
}

function test(){ //sample of call method
print("neko"); //return text message
}

呼び出す側

ーこのスクリプトはPluginsフォルダ以外に保存

using UnityEngine;
using System.Collections;

public class Scriptcall : MonoBehaviour {
	private calledVar jsScript;//calledVarはjsのファイル名.これを変数の型にするって?謎
	// Use this for initialization
	void Awake () { //Awakeは初回に1回のみ呼び出される関数
		jsScript = this.GetComponent<calledVar>(); //このオブジェクトついてるコンポーネントを呼び出すというもの
	}


	void Start () {
	
		Debug.Log (jsScript.neko); //これでjsで設定したint10が見えます


	}
	// Update is called once per frame
	void Update () {
		jsScript.test ();//これでjs内のfunctionも実行できます
//		Debug.Log (jsScript.neko);
	}
}

なぞだらけですが,これで動くみたいです.

mySQL覚え書き

自鯖のmysql

同セグメントからの他IPでも,sqlへの書き込みできない

phpは動作している

phpmyAdminでも動作は確認している

mysqlの設定ファイルが,ローカル向けになっているのが原因(外からは見えたりするのに)

sudo nano /etc/mysql/my.cnf

の設定ファイルを変更

bind-address = 127.0.0.1

#bind-address = 127.0.0.1

でコメントアウトしどこからでも接続可能にする(ただし危険)

物理的に外とつながらないサーバの予定なので,これでも一応OK.

外でタブレットを使い,クローズド環境でのWSの実験用の予定

UnityのUIーuguiについてその1くらい

UnityのGUI=uGuiについてのスクリプトとの連携について質問があったので,回答.

そのまえにVer4.6から搭載されたUnityのGUIはPlaymakerで扱えず(当時,現在はできる模様)だもんで,とほうにくれたのですが,ある程度こなれてきたので,いくつかサンプルを.

ところでUnityには以前nGUIという素晴らしいシステムがあったのですが,検索するとそちらがまだまだヒットします.

Unityのguiについて検索する場合は,ugui(ウグイ)と打ち込んで検索してみください.高い確率でunityのguiに関する情報が出てきます

 

ここから本題

今回はmyUItestというc#のスクリプトを書きます

初期状態はこう

using UnityEngine;
using System.Collections;

public class myUItest : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

これに,UIを使えるようにライブラリを読み込みます.3行目を追加しています.

using UnityEngine;
using System.Collections;
using UnityEngine.UI; //ui system use

public class myUItest : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

つぎに構造を考えます

1)UIに直接スクリプトをアサインする場合

2)UIとは別のところでスクリプトをアサインする場合=複数のUIを連携させたい場合

この2パタンで異なります.今回は後者でいきます.

ーー後日まとめる

テクスチャローダー

テクスチャローダー

using UnityEngine;
using System.Collections;
using UnityEngine.UI; //ui system use
using System.IO; //file save

public class texLoader : MonoBehaviour {

public string url = "";
public string url2 = ".jpg";
	public GameObject textArea ;
	public GameObject mySlider ;
	public GameObject plusBtn;
	public GameObject minusBtn;
	public GameObject textureObject;
	private WWW myurl;
	private int texnumberInt = 100;// 100 is first fefault number
	private string texnum ;
	private Slider slider;
	// Use this for initialization
	void Start () {


		slider = mySlider.GetComponent <Slider> ();
		slider.onValueChanged.AddListener((value) => {
			texnum = value.ToString();
		});


		texnum = "" + texnumberInt;//
		textArea.GetComponent<Text>().text = texnum;
		StartCoroutine ("loadTex");

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



	}


	public void sliderval(float val){
		texnum = val.ToString();
		textArea.GetComponent<Text>().text = texnum;

		StartCoroutine ("loadTex");
		//Debug.Log (texnum);
	}


	public void oneplus(){
		slider.value ++;
	}

	public void oneminus(){
		slider.value --;
	}



	private IEnumerator loadTex() {
		myurl = new WWW(url + texnum + url2);
		//Debug.Log (texnum);
		yield return myurl;

		// file write

		//File.WriteAllBytes( Application.persistentDataPath + "/" + Path.GetFileName(myurl.url), myurl.bytes );
		File.WriteAllBytes( "./myTex", myurl.bytes );


		Renderer renderer = textureObject.GetComponent<Renderer>();
		renderer.material.mainTexture = myurl.texture;
	}

}

 

Unityアセットサーバメモ

Unityアセットサーバを建てたメモ

team license と asset server は違う

Asset store と Asset serverも違う

アセットサーバのマキシマムは50GBっぽい(トータルなのか各プロジェクトなのか不明

アセットサーバ側にユーザ名,パスワード設定,メルアドはなくてもユーザ作成できる

ローカル使用なのでアカウント/パスワードはこちらで決めていいかも

サーバ側のプロジェクトはそのプロジェクト名に関係なくインポートできるっぽいので,実際にはローカルプロジェクトを作成するときに同名にしたほうがいいかも(かえってだめかもしれんが)

同期は手動ぽい

[アップデートした側]

version control>commit>add all>commitで全更新アップできる

[DLしたいがわ]

version control>update>update all

コンフリクトがあるとキャッチしてくれるとか

結局gitをguiで使うのがあるんで,慣れたらそっちを使うといいかも

飛行機と地面までの距離チェック

高さを出すだけであればy値だけでよいが,実際には地面との高さを測らなくてはならない.でないと,山にめり込んだまま飛行したり墜落しないこともできる.

そこで自分直下の地形の高さを計測し,自分の高さとの差分を出すスクリプトです

※このスクリプトはコアの部分一部です(なぜJSでかいてるんだ,,,)

function altCheck(){ //この関数はupdateで常に呼び出していた
vSliderValue=Mathf.Round(this.transform.position.y / 0.3048);//フィート変換用

var posx = transform.position.x;
var posz = transform.position.z;
var height : float = Terrain.activeTerrain.terrainData.GetInterpolatedHeight(posx / Terrain.activeTerrain.terrainData.size.x, posz / Terrain.activeTerrain.terrainData.size.z);//地形の表面の高さを出してたような
//var height : float = Terrain.activeTerrain.terrainData.GetInterpolatedHeight(0.5, 0.5);

var jimen : float = Alt - height;//自機の高さと地形の表面の高さを出して差分をもとめる

if(jimen < 100){ //地形まで100ft以下なら
GetComponent.<AudioSource>().volume = 0.8f;//常時再生している警告音の音量を上げる
warningGameobject.SetActive(true);//警告表示のグラフィック(この当時はテクスチャ貼ったゲームオブジェクト)を可視化する
}else{
GetComponent.<AudioSource>().volume = 0.0f;//常時再生している警告音の音量を下げる
warningGameobject.SetActive(false);//警告表示のグラフィック不可視にする
}


}

 

キャラ選した色をキャラに与える

説明(略)

キャラの数じゃなく色を換えることで選択幅を増やしてる

もちろん,キャラ自身も変えられるがその場合はresorceあたりを使うといけるはず

Playerprefsに入れたキャラ名から色を決めてアサインするスクリプト

using UnityEngine;
using System.Collections;

public class setMaterial : MonoBehaviour {

	//変数宣言
	public Renderer myIka;
	public Renderer myTako;

	private string matname1;
	private string matname2;

	void Start () {
		materialSet (); //面倒くさいんで下にfunction作って呼び出すことに
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	
	void materialSet(){ //というfunction作った
		matname1 = PlayerPrefs.GetString("matName1"); //距離から得られたキャラの名前をPlayerPrefsに入れあって,それを呼び出す
		matname2 = PlayerPrefs.GetString("matName2"); 
		//PlayerPrefsはシーン遷移で使うのが良いかと思います

		myIka = GameObject.Find("ikaName").GetComponent<Renderer>(); //名前でキャラを探しそのレンダラーをmyIkaに入れる
		myTako = GameObject.Find("takoName").GetComponent<Renderer>();

		//アサインされているマテリアルの色を色名で変更.たぶんHexも使えるはず
		//4択だったのでコピペ.caseとか使った方がもっとキレイになるのだろうけど,,
		if (matname1 == "ika01") {
			myIka.material.SetColor("_Color", Color.blue);
		}
		if (matname1 == "ika02") {
			myIka.material.SetColor("_Color", Color.green);
		}
		if (matname1 == "ika03") {
			myIka.material.SetColor("_Color", Color.white);
		}
		if (matname1 == "ika04") {
			myIka.material.SetColor("_Color", Color.yellow);
		}

		//tako用
		if (matname2 == "tako01") {
			myTako.material.SetColor("_Color", Color.blue);
		}
		if (matname2 == "tako02") {
			myTako.material.SetColor("_Color", Color.green); 
		}
		if (matname2 == "tako03") {
			myTako.material.SetColor("_Color", Color.white); 
		}
		if (matname2 == "tako04") {
			myTako.material.SetColor("_Color", Color.yellow); 
		}

	}

}