Pages

2012年7月29日日曜日

NGUIでスクロールを実現するには

1 Panelを別に用意する

NGUIメニューのAddPanelで追加できます。

2 1にUIPanelのclippingを設定する

SoftClipにしてsizeを設定
ここが、ドラッグさせるアイテムを表示できる大きさの限界を指定するところ。
ここで指定した大きさの窓からアイテムをのぞく感じになるイメージ。

3 UIPanelにUIDraggablePanelスクリプトをつける

scaleにはドラッグさせる方向を設定する。
横のみなら x=1 y=0 z=0

4  ドラッグさせるアイテムをつける

ここではアイテムを等間隔で配置するため、UIGridを作成します。

子要素に、UIGridをつけwidthとHeightを設定する。

UIDragPanelContentスクリプトをつける。

5 UIGridにアイテムを子要素で設定する

すべてにUIDragPanelContentスクリプトをつける。

プレイボタンを押すと等間隔で配置されます。

***問題***
1 スクロール実現方法

NGUIでのスクロールには2つの方法があります。(もうひとつはカメラを別に用意する方法)
こちらのほうが直感的なのでメインに利用しています。


Androidで利用する場合のハマるポイントとして、OpenGL2.0でないと正しく表示されません。
そこで、PlayerSettings→Other settings→Graphic levelでOpenGL2.0を選びましょう。




NGUIの多言語対応でコードからテキストを変更するには

以下、UILabelにUILocalizeをつけているものとする。


まずはキーを変更
uiLocalize.key="newTextKey";


これだけではテキストは変化しません。NGUIのローカライズは、OnEnabledで行われるからです。
そこで、自力でテキストの値をローカライズして取得する処理を書き足します。
uiLabel.text = Localization.Get( newTextKey );

Unity3Dで現在のシーンを判別するには


Application.loadedLevelName=="シーンの名前"

これだけ!

NGUIでUNITY3Dの多言語対応を実現する


1 Localizationフォルダを作成 その中にテキストファイルを入れる

キー=値のペアで改行する

tittle=たいとる
sub=さぶたいとる

対応する言語分のテキストを用意して名前をつける

English.txt
Japanese.txt


2 Localizationのプレハブをシーンにコピペ

NGUI→Example→Otherにある

3 UILabelのついたオブジェクトにUILocalizeスクリプトをつける


UILocalizeコンポーネントの
Keyプロパティに1の言語テキスト名をつける(ここではEnglish or Japanese)


言語の切り替えは、Localizationコンポーネントの値をいじって行う。

これはまた今度

2012年7月26日木曜日

Unityでメニューをアニメーションさせるには


アニメーションを呼び出場合。
例:メニューパネルをサイドからシュッと出すとき

public GameObject Panel;//animationコンポーネントをつけたパネル

呼び出すとき
Panel.animation["PanelAnimation"].speed=1.0f;
Panel.animation["PanelAnimation"].time=Panel.animation["PanelAnimation"].length;
Panel.animation.Play("PanelAnimation");

アニメーションを逆転させるにはspeedを反転します

Panel.animation["PanelAnimation"].speed=-1.0f;

2012年7月12日木曜日

UnityAndroidで端末の言語設定を取得する

Application.systemLanguage

戻り値は以下のページにリストあり
http://docs.unity3d.com/Documentation/ScriptReference/SystemLanguage.html


NGUIでは、こんなかんじ


if(Application.systemLanguage.ToString()=="Japanese"){

           //ローカライズの現在の言語を変更する
Localization.instance.currentLanguage="Japanese";


}


IPhoneではバグがあるみたいで、報告済みとのこと。
Unityフォーラムからの情報。

EasySave2で保存、読み込み、設定など


保存先などの設定
ES2Settings settings;

settings = new ES2Settings();
settings.saveMode = ES2.SaveMode.Overwrite;//モード、ここでは上書きを選択
settings.saveLocation = ES2.SaveLocation.PlayerPrefs;//保存先パス指定もできます
settings.encrypt = false;//暗号化するか


保存
ES2.Save(false,"SGData?tag=タグ",settings);
配列の保存
ES2.Save(iarray,"SGData?tag=タグ",settings);

読み込み
ES2.Load<型名>("SGData?tag=タグ");


配列の読み込み
ES2.LoadArray<型名>("SGData?tag=タグ")


タグが存在するかを調べるには
ES2.Exists("SGData?tag=タグ")

ただフォーラムを見る限り、このES2.Exists関数は遅いとのことなので
ゲームループの中で使わないように初期化でチェックするなどの対応が必要。

UnityAndroidでブラウザアプリを起動するには



Application.OpenURL("URLをここに書く");

UnityAndroidでメールアプリを起動するには


これだけ

Application.OpenURL("mailto:アドレス?subject=件名");

例:
Application.OpenURL("mailto:?subject=Recommended App&body=Download and enjoy! "+WWW.EscapeURL("http://")

UnityAndroidで戻る(バックキー)に対応する

以下をOnGUI内に記述するだけ

if (Input.GetKeyDown(KeyCode.Escape)) {

 //ここに処理を書く

2012年7月10日火曜日

Unityで効果音を鳴らすには



AudioSourceコンポーネントをつけたオブジェクトに
以下を含むスクリプトを付加します。

public AudioClip audioClip;

public void PlayAudio(){
audio.PlayOneShot(audioClip);
}

 AudioClipをpublicに定義したのでこのオブジェクトにaudioClipを設定できます。


シーンのヒエラルキーから、オーディオファイルをドラッグして設定しましょう。


オーディオの再生には、PlayOneShotメソッドを使います。

ここでは、鳴らすときにPlayAudio()メソッドを他のスクリプトから呼び出します。

iTweenで音のピッチを突然変えるエフェクト


幸せな音楽が突然不快な音とともに終了する、みたいな効果です。
コメディでも結構使えますね。

音を変化させるにはAudioToを使います。ちなみにAudioFromは逆の動き。

iTween.AudioTo(gameObject,iTween.Hash("volume",0.8f,"pitch",0.0f,"time",3.0f,"oncomplete","PlayAnotherOne"));

gameObjectはAudioSourceを付加しているオブジェクトが入ります。ここでは自身を設定。
ハッシュに設定したpitchとvolumeにtimeでなります。

oncompleteの次には、終了時に呼ばれるメソッド名をstringで渡します。

もっと細かい設定をしたい場合には、さらにハッシュに引数をセットで渡します。

詳しいパラメータは以下
http://itween.pixelplacement.com/documentation.php

2012年7月8日日曜日

オブジェクトがタップされたかを判定する


タップされた位置に3Dオブジェクトがあるかどうかなど。タップで動きを変えるときなどに使用します。

以下を含むスクリプトを判定したいオブジェクトのコンポーネントに付加します。
ざっくり言うと、タップされた位置から画面奥に、レイと呼ばれる光線をカメラが飛ばします。一番最初に光線が当たった場合に、その情報を取得できます。

Ray ray ;//光線
RaycastHit hit ;//光線が当たったときの情報が入ります
Camera myCamera;//カメラを指定します。

void Update(){

if(Input.touchCount == 1) {//タップあり時にtrue
       Touch touch = Input.touches[0];
          ray = myCamera.ScreenPointToRay(Input.touches[0].position);

       if(touch.phase == TouchPhase.Ended && Physics.Raycast(ray.origin,ray.direction,out hit,Mathf.Infinity)){


if(hit.collider==gameObject.collider){

//タップされた位置にオブジェクトがあった場合の処理。


   }

  }else if (touch.phase == TouchPhase.Ended && !Physics.Raycast(ray.origin, ray.direction,out hit,Mathf.Infinity)) {


//光線に当たるオブジェクトが何一つ無いとき

  }
}

myCamera.ScreenPointToRay(Input.touches[0].position);で光線をとばします。
ここではタップのあった場所を渡し、始点としています。


touch.phaseでタップのどの時点かを指定します。
ここではTouchPhase.Endedで指が離れた時にtrueとなります。
Physics.Raycastは何かのオブジェクトが当たったときにtrueとなります

オブジェクトを他のオブジェクトの子に設定

子オブジェクト.transform.parent = 親オブジェクト.transform;

~秒後に特定の処理を行いたいとき


コルーチンを使うと便利です。


IEnumerator型に処理を定義し、その後にStartCoroutineメソッドで呼び出します。

IEnumerator WaitAndGo(引数) {
       
     //**1 最初の処理**
 yield return new WaitForSeconds(2.0f);//ここでは2秒待ってから以下を行う
        //**2 2秒後に行う処理**


 }


StartCoroutine(WaitAndGo(引数));//呼び出し側

上で定義したWaitAndGoを呼び出しています。

処理の流れは、

1 **1 最初の処理**
2 2秒間待つ
3 **2 2秒後に行う処理**

というイメージになる。

2012年7月7日土曜日

ゲームを一時停止する



Time.timeScale = 0;
でゲームループがすべて停止します。

Time.timeScale = 1;//で復帰

2012年7月6日金曜日

特定のオブジェクト間の判定を回避する



Physics.IgnoreCollision(ColliderA,ColliderB);

Physics.IgnoreCollision(ColliderA,ColliderB,false);//で判定復帰

または、あらかじめレイヤ分けしておいて


Physics.IgnoreLayerCollision(14,9,true);

Physics.IgnoreLayerCollision(14,9,false);//で判定復帰
14 9という数字はレイヤの番号を指定しています。

iTweenでHUDの数を少しづつ増やすアニメーション


コインの数を一気に増やすのではなく、すこしづつ増やすアニメーションです。

iTween.ValueTo(gameObject,iTween.Hash("from",startNum,"to",endNum+100,"time",.6,"onupdate","UpdateNum","name","Coins"));

ここでもHashで対に引数を渡しています。

fromからtoまでtimeの早さでアニメーションします。
onupdateの次に指定するのは、フレームごとに呼ばれるメソッドです。自動的に数字が渡されます。
nameの次の要素"Coins"は、このアニメーションをストップするときに使用します。

UpdateNum(int num){

  ~.text=num.toString();

}

オブジェクトの破棄とプレハブからの動的生成


1 オブジェクトの破棄

Destroy(gameObject);//gameObjectはスクリプトがついているオブジェクト自身を表す

オブジェクトについている子オブジェクトも一緒に破棄されます。

Destroy(this);//スクリプト自身を破棄するにはこう


2 プレハブからオブジェクトを生成

Instantiate(GameObject 生成するプレハブ,Vector3 どこに,Quaternion 角度);


public GameObject Peach;

Instantiate(Peach,DropPoint.transform.position,Quaternion.identity) ;

トリガーや衝突判定でタグから対象を特定する



1 トリガーの場合

トリガーを持つオブジェクトのスクリプトに、 OnTriggerEnterメソッドを付加すると、何かがトリガーに入ってきたら自動的に呼ばれます。

void OnTriggerEnter(Collider other){


if(other.tag=="chara"){//otherには入ってきたオブジェクトが渡されているのでtagを比較しています。


}

}

2 衝突判定の場合

トリガーと全く同じ
void OnCollisionEnter (Collision collision ) {


if (collision.gameObject.tag == "chara") {



}
}

iTweenでカメラフェイドイン&アウト



1 画像とカメラの設定

public Texture2D fadeTexture;

void Start () {
//画像がない場合も必ず必要!カメラに設定します。
iTween.CameraFadeAdd(fadeTexture);
//フェイド時に見せる画像を用意しないときは引数は不要

}


2 呼び出し
//以下を呼び出すことでフェイドアウトする
GUICam.SetActiveRecursively(false);//NGUIを使う場合のみ、マニュアルでカメラをフェイドアウト

iTween.CameraFadeTo(iTween.Hash
("amount",1.0f,"time",2.0f,"oncompletetarget",gameObject,"ignoretimescale",true,"oncomplete","FadeOut"));

引数はHashで渡す。


"oncomplete"はフェイドアウト完了時の呼び出すメソッド名、以下のように作成して、画面遷移します。

FadeOut(){

Application.LoadLevel("Main");


}

ex2DとNGUIを端末ごとの解像度に対応させる


解像度に合わせて、オブジェクトのサイズを変えるようにするには

【 ex2Dの場合】

EX Pixel Perfect Cameraスクリプトをカメラに設定する
CustomResolutionにチェックを入れる
Width(幅)とHeight(高さ)を設定する

 【NGUIの場合】

UIRootで、Automaticを外して、Heightを設定する