Unityで、#UNITY_IOS等の、エディタ上とプラットフォームの判定を勘違いしてた

Unityで、よくAndroidや、iOSの条件分岐かく 「#if UNITY_IOS」等の分岐ですが、

勘違いして使っていました。


#if UNITY_ANDROID Debug.Log("androidだよー"); #elif UNITY_IOS Debug.Log("iosだよー"); #else Debug.Log("unityエディタ含むよー"); #endif

を、Unity上のswitch platformで 『iOS』にしていて、
Unity上で実行したら。。


unityエディタ含むよー

となるとおもっていた。。。汗

違かった。。。

実際は、


iosだよー

と、なった

ほんまアホやった。。


#if UNITY_EDITOR Debug.Log("Unityエディタで実行中だよー"); #elif UNITY_ANDROID Debug.Log("androidだよー"); #elif UNITY_IOS Debug.Log("iosだよー"); #else Debug.Log("その他だよー"); #endif

#if UNITY_EDITOR

これがしたかったやつや。。

さっきのはあくまでswitch platformで指定しているiOSの条件にものでした。。

Unity、角度を適用させる〜備忘録。

Unityで毎回、角度適用の仕方を忘れてしまうので、メモφ(..)メモメモ

角度を加算する。


transform.Rotate(0,0,addAngle);

指定の角度にする


// 角度を適用 transform.rotation = Quaternion.Euler(0.0f,0.0f,targetAngle);

transform.rotation = targetAngle; みたいな事はできないのでご注意をw

Unityで二次元配列を、stringに変換するコード

2次元配列を、string変換

Unityで通信用に変換したりする時に利用できそうなのでメモ。
下記は、int型の二次元配列の例でっす


// 二次元配列を文字列化 public static string Arr2StrEncode(int[,] intArr){ string str = ""; for (int i = 0; i < intArr.GetLength(0); i++) { for (int j = 0; j < intArr.GetLength(1); j++) { str = str + intArr [i, j].ToString(); str = str + ","; //列の区切り文字 } str = str + "\n"; //行の区切り文字 } return str; }

namespaceで、一元化しておくと便利。
あと、列と、行の区切り文字も変換できるようにしておいた方がいいです。。

Unityで、指定のGameObjectの子の数だけ、カウント&制御

unity5 Hierarchy 子供の数制御

Unityで、指定のGameObjectの子供の数分foreachで、数えて。表示/非表示

ハート等のライフポイントの数だけGameObjectを出す例。

unity5 Hierarchy 子供の数制御

上記のように、Hierarchyに配置したGameObjectの子の数を数えて、表示、非表示など制御。


GameObject arrObj = GameObject.transform.Find ("GameObject/GameObjectHoge").gameObject; int num = 0; foreach(Transform childObj in arrObj.transform){ // ライフポイントの数だけ、GameObjectをアクティブにして表示、指定ポイントより低かったら非アクティブ if (lifeCount > num) { childObj.gameObject.SetActive (true); } else { childObj.gameObject.SetActive (false); } num += 1; }

この例だと、ライフポイントの数だけ、GameObjectをアクティブにして表示、指定ポイントより低かったら非アクティブして、
ライフポイントの表示制御をしています。

間違えやすいポイントとして、 foreachの型指定が、GameObject型ではなく、Transform型にしないとエラーになります。

Unity 指定敵タグ等の合計値を出す

Unityで敵全部のHPをまとめたりする。

Unityで出現中の敵全員のHPを合計で出したりして、進捗を出す事はよくあるケースだと思う。

そんな時のC#スクリプト


int enemyAllHp = 0; GameObject[] targetEnemyObjs; // foreachで検索する、Enemyタグのオブジェクト。 targetEnemyObjs = GameObject.FindGameObjectsWithTag("Enemy"); foreach(GameObject targetEnemyObj in targetEnemyObjs){ // 敵HPの総数。 enemyAllHp += targetEnemyObj.GetComponent<EnemyController>().enemyHp; }

地道にループ

Unity NGUI UILabel周りをスクリプトを扱う方法一覧

Unityの便利なasset NGUI。
そのNGUIの「UI Label」をスクリプトから扱う方法

テキストの基準位置の変更(左寄せや、下寄せ等)

GetComponent<UIWidget>().pivot = UIWidget.Pivot.Center; //センタリング

または

GetComponent<UILabel>().pivot = UIWidget.Pivot.Center; 

でもOK

テキストの表示領域のサイズ変更

GetComponent<UIWidget>().width = 60; //幅
GetComponent<UIWidget>().height = 60; //高さ

Unity5で対象物を一定速度でドラッグ&ドロップ

Unity5で、タップした位置に対象物を移動。

タップした位置に、パズルのピースのようにものを移動する場合。

using UnityEngine;
using System.Collections;

public class dragSample : MonoBehaviour {
    float touchX;
    float touchY;

    void Update(){
        touchX = Input.mousePosition.x;
        touchY = Input.mousePosition.y;

        if(Input.GetMouseButton(0)){
            OnDrag();
        }
    }

    void OnDrag(){

        gameObject.transform.position = Vector3.MoveTowards (gameObject.transform.position,Camera.main.ScreenToWorldPoint(new Vector3(touchX,touchY,10.0f)), 0.1f);
    }
}

解説

  • Camera.main.ScreenToWorldでタップ位置の座標に変換
  • MoveTowordsで、対象物と、持って行きたい位置、それとそこまで移動する速度

マウスのドラッグ&ドロップするように移動する場合は、

MoveTowordsを除けばOK、下記のように。

transform.position = Camera.main.ScreenToWorldPoint(new Vector3(touchX,touchY,10.0f));

Unityで、”Error building Player because scripts had compiler errors”とでたら

Unityを使っていて、ビルド時にいきなりみたことないエラーが表示されたので、
それを解決した際のメモ。

Unityでiosでビルド時に、下記のようなエラーでてビルドできなくなった。
“Error building Player because scripts had compiler errors”

しらべてみたところ、UnityEngineをoverrideしているところで、
エラーになっているようで、対象のUnityEngineを使っているソースを、

通常のScriptsフォルダから、Editorフォルダに移動したら解決した。

ググっても同じような解決策の人がいなかったので、
念のためメモ。