ラベル Unity の投稿を表示しています。 すべての投稿を表示
ラベル Unity の投稿を表示しています。 すべての投稿を表示

2015年2月28日土曜日

[Unity]uGUIのButtonを押したあとハイライトが残ってしまう問題

Button(Script)のNavigarion -> Automatic -> Noneにする。


このNavigarionという機能はボタンなどのUIを使用した時にどういった動作するか決めるものらしい。

2014年11月23日日曜日

[Unity]EasyTouchを使う

Unity 4.6.0b20
EasyTouch 3.1.10
  1. EasyTouchをインポート
  2. pluginsフォルダはプロジェクトのルートになければならない
  3. ツールバー > Tools > Hedgehog Team > EasyTouch > Add EasyTouch for C#
    HierarchyにEasyTouchが追加される
  4. HierarchyのEasyTouchを円卓Auto-SelectProperties > Pickable LayersをDefaultにする
  5. タップしたいオブジェクトに以下のコードのスプリクトを追加
    オブジェクトにはColliderが必要
using UnityEngine;
using System.Collections;

public class TapSample : MonoBehaviour
{
 //シングルタップを登録
 void OnEnable()
 {
  EasyTouch.On_SimpleTap += On_SimpleTap;
 }
 
 //登録の解除
 void OnDisable()
 {
  UnsubscribeEvent();
 }
 
 //登録の解除 
 void OnDestroy()
 {
  UnsubscribeEvent();
 }
 
 void UnsubscribeEvent()
 {
  EasyTouch.On_SimpleTap -= On_SimpleTap; 
 }
 
 //タップ時に通知を受け取る
 private void On_SimpleTap(Gesture gesture)
 {
  if (gesture.pickObject == gameObject) {
   //タップ時の処理
  }
 }
}

2014年11月22日土曜日

[Unity]Hierarchyにあるスプリクトのインスタンスをロードする

GameObject dataManager = GameObject.Find("/DataManager");
DataManager dataManagerScript = (DataManager)dataManager.GetComponent<datamanager>();
dataManagerScript.hogeIndex += 100;

[Unity]NGUIでUIRootが複数表示され、UIが表示されなくなる問題

Unity 4.5.5f1
NGUI 3.7.3

NGUIでUIが表示されない問題があった。
Hierarchyを見るとUIRootが大量に表示してある状態になっていた。

どうやらNGUIで作ったPrefabをHierarchyにドラッグしているときに
UIRootが自動的に作成されるようだ。

こうなるとUIRootが競合してすべてのNGUIのUIが表示されなくなる。

・解決方法
  1. 自動で作成されたUIRootをすべて削除する
  2. 使っているUIRootを非Activeにする
  3. ツールバー > NGUI > Create > UI Root (3D or 2D)を選択(UIRootがアクティブだと追加できない)
  4. 使っている非ActiveのUIRootの中身を3.で作った新しいUIRootに移動
  5. 使っている非ActiveのUIRootを削除
で正常に動くが、AnchorsをUnfiedにしているとNoneになるので、再度Unfiedにする必要がある。

2014年11月21日金曜日

[Unity]NGUI UIScrollViewを使う

Unity 4.5.5f1
NGUI 3.7.3

典型的なリストを作りには
Scroll View
>Grid
>>Sprite
>>Sprite
>>Sprite
>>Sprite

のように配置するとリストが作られる


UIScrollView

Content Origin
内部Viewの位置をどの方向にするか

Movement
どちらの方向にスクロールするか

Drag Effect
ドラック時スクロールエリアの最後にきた時に動作、iOSでいうところのBounds

Scroll Wheel Factor
ホイールを動かした時の移動量(マウスホイール限定?)

Momentum Amount
ドラッグ、スマホのフリック時の移動量

Restric Within Panel
ドラッグ時のスクロールは内部のViewに制限されるか
falseにするとどこまででもスクロールできる、普通はtrue

Cancel Drag if Fits
iOSでいうpagingEnabledとおなじ、画像アプリなどでよくある1枚1枚スクロールするかどうか

Smooth Drag Start
ドラッグ開始時にスムーズ処理が入る、体感ではあまり変わらない

iOS Drag Emulation
ゆっくりドラッグした時に移動速度が半分になるらしい、体感ではあまり変わらない

2014年11月17日月曜日

[Unity]MiniJSONの使い方

UnityでJSONを扱うにはいくつか種類がある
MiniJSON
JSON Object
LitJSON
NGUIJSON
今回は導入が簡単なMiniJSONを使用する
MiniJSONのファイルをダンロードしてProjectに配置
Deserializeで解析することができる。
Dictionaryの扱いがいまいちなサンプル
TextAsset textData = (TextAsset)Resources.Load ("jsonData");
string jsonString = (string)textData.text;
Dictionary&ltstring object&gt root = (Dictionary&ltstring,object&gt)Json.Deserialize (jsonString);
List"<"object">" firstList = (List"<"object">")root ["FirstList"];

2014年10月31日金曜日

[Unity]TouchScriptの使い方

ExamplesフォルダにあるSenseにサンプルがある

TapさせたいときはオブジェクトにAdd Component > Tap Gestrure(Script)を追加する
Colliderも追加する
using System;
using UnityEngine;
using TouchScript.Gestures;

public class TapManager : MonoBehaviour
{
    void OnEnable ()
    {
        GetComponent<tapgesture> ().Tapped += tappedHandler; 
    }
    
    void OnDisable ()
    {
        GetComponent<tapgesture> ().Tapped -= tappedHandler;
    }
    
    private void tappedHandler (object sender, EventArgs e)
    {
        Destroy (gameObject);
    }
}

2014年10月29日水曜日

[Unity]Resourcesにあるプレハブを読み込みインスタンスを生成する

Unity 4.5.5f1

プレハブの読み込みは公式にサンプルコードがある

Resources.Load
http://docs.unity3d.com/ScriptReference/Resources.Load.html

以下のコードはInstantiateの戻り値がObjectなのでGameObjectに変換できない、としてコンパイルエラーが発生する

//コンパイルエラー
GameObject instance = Instantiate (Resources.Load ("enemy"));
不格好だがこんなキャストでいける
//Load可能
Transform instance = (Transform)Instantiate ((Transform)Resources.Load ("enemy"));
これで動作はするが、どこかおかしい気がする

2014年10月28日火曜日

[Unity]PlayerPrefsで保存する

UnityではPlayerPrefsを使ってデータを保存できるが、longbool、配列には対応していない。

そこで各種の型に対応したPlayerPrefsXがある
ArrayPrefs2
直接cs,jsファイルはDLできないようなので、コピペで作る。

ただこれだとPlayerPrefsPlayerPrefsXを使い分けるようになるので、PlayerPrefsと同じメソッドを持つよう以下のように編集すると使いやすい
public static bool SetString (string key, string value)
{
    PlayerPrefs.SetString (key, "" + value);
    return true;
}

public static String GetString (string key)
{
    return (PlayerPrefs.GetString (key));
}

public static bool SetInt (string key, int value)
{
    PlayerPrefs.SetInt (key, value);
    return true;
}

public static int GetInt (string key)
{
    return (PlayerPrefs.GetInt (key));
}

public static bool SetFloat (string key, float value)
{
    PlayerPrefs.SetFloat (key, value);
    return true;
}

public static float GetFloat (string key)
{
    return (PlayerPrefs.GetFloat (key));
}

2014年10月27日月曜日

[Unity]連想配列を使う、配列にあるオブジェクトを削除する

//Unity 4.5.5
//リストから要素を取り出す
foreach (Transform child in transformList) {
    Deubg.log(child.localPosition);
}

//Destroyで削除するときは連想配列は使えない
//C#逆順で連想配列を取り出すことはできない、List.Revers()では配列が逆転するだけ
for (int i = transformList.Count - 1; 0 <= i; i--) {
    //Transformの時はDestory時に.gameObjectを取り出す
    Object.Destroy (transformList [i].gameObject);
}

2014年10月17日金曜日

[Unity]Input.Touchesの使い方

https://www.assetstore.unity3d.com/jp/#!/content/3283

・Input.Touchesはスマホのタッチイベントを最適化したスクリプト
・スワイプ、ピンチ、ドラッグ、回転、ダブルタップ、ロングタップ、ショートタップ、チャージなどを検出することができる
・タッチが検出できないPCでの動作ではマウスと同様の動きをする
・価格は25$

使い方
Unity 4.5.5
Input.Touhes v1.1.5

InputTouches > InputPrefb > GestrueのプレハブをHierachyに追加
Hierachyに適当なオブジェクトを追加して新規Scriptを追加
//C# サンプルコード

//オブジェクトが有効になった時に呼び出される
void OnEnable() {
    //onShortTapE、onDoubleTapEというイベントがあるが、
    //onMultiTapEに統合されていおり、
    //onShortTapE、onDoubleTapEはいずれ廃止される 

    //リスナーに登録

    //通常のタップとマルチタップを検出する
    IT_Gesture.onMultiTapE += OnMultiTap;
    //ロングタップ
    IT_Gesture.onLongTapE += OnLongTap;
    //チャージング(タップしたままホールド時間を随時検出)
    IT_Gesture.onChargingE += OnCharging;
    //チャージング終了(チャージ後に指が離れた)
    IT_Gesture.onChargeEndE += OnChargeEnd;
   
    //ドラッグ開始
    IT_Gesture.onDraggingStartE += OnDraggingStart;
    //ドラッグ中
    IT_Gesture.onDraggingE += OnDragging;
    //ドラッグ終了
    IT_Gesture.onDraggingEndE += OnDraggingEnd;
}

//オブジェクトが無効になった時に呼び出される
void OnDisable() {
    //リスナーの登録を解除
    IT_Gesture.onMultiTapE -= OnMultiTap;
    IT_Gesture.onLongTapE -= OnLongTap;
   
    IT_Gesture.onChargingE -= OnCharging;
    IT_Gesture.onChargeEndE -= OnChargeEnd;
   
    IT_Gesture.onDraggingStartE -= OnDraggingStart;
    IT_Gesture.onDraggingE -= OnDragging;
    IT_Gesture.onDraggingEndE -= OnDraggingEnd;
}

//以下のメソッドでタッチを検出する

void OnMultiTap(Tap tap){
    //do a raycast base on the position of the tap
    //対象のオブジェクト(shortTapObj)がタップされているか調べる、
    //1つ1つ調べるのは結構面倒くさい、タップだけならAssetStoreのTouchScriptが良いかも
    Ray ray = Camera.main.ScreenPointToRay(tap.pos);
    RaycastHit hit;
    if(Physics.Raycast(ray, out hit, Mathf.Infinity)){
        //if the tap lands on the shortTapObj, then shows the effect.
        if(hit.collider.transform==shortTapObj){
            //place the indicator at the object position and assign a random color to it
            Indicator.transform.position=shortTapObj.position;
            Indicator.startColor=GetRandomColor();
            //emit a set number of particle
            Indicator.Emit(30);
        }
        //if the tap lands on the doubleTapObj
        else if(hit.collider.transform==doubleTapObj){
            //check to make sure if the tap count matches
            if(tap.count==2){
                //place the indicator at the object position and assign a random color to it
                Indicator.transform.position=doubleTapObj.position;
                Indicator.startColor=GetRandomColor();
                //emit a set number of particle
                Indicator.Emit(30);
            }
        }
    }
}

2014年5月20日火曜日

[Unity]Unityをはじめて触ってみた時のメモ

3日ほどUnityのiOS、Androidアプリを作ってみて、
コイン落としのようなアプリができたので使用感とハマったポイントを書き出してみる

・公式の日本語ドキュメントは豊富

・Assetを使うと時間を短縮できる

・言語は3つある
Javascript
チュートリアルや書籍の多くがJavascriptで書かれているが
UnityScriptと呼ばれるぐらいHTMLで使用するJavascriptと離れているのでちょっと使いにくい

Boo
Pythonっぽい言語になっている、これで書いている人は少ないようだ

C#
ドキュメントも豊富で結局C#を選択した

・全てのassetやサンプルプログラムがスマホ用に最適化されているわけではない

Unityでは複数のプラットフォームに対応するために
[Project Setting]>[Input]から呼び出せる入力用Wrapperが標準で用意されているために
コントローラー、ジョイスティックやキーボードの入力を簡単に設定できる
例、プレイヤーが右に移動するスプリクトを組むだけで
コントローラー右、ジョイスティックを右に傾ける、キーボード"D"キー
の3つが対応される

ただしタッチパネルの場合は例外でコードを入力する必要がある。
function Update () {
 for (var touch : Touch in Input.touches) {
  //TODO touch event
 }
}

タッチイベント用のAssetも豊富にある
オススメはこちら

TouchScript

タップ、ドラッグ、ロングタップなどに対応
スマホ以外にもWindows系列にも対応している
サンプルの動作が自然な感じなので作成するアプリに役立ちそう