Unityで、こんなログがでたら、
"Trying to Invoke method: HogeManager.DelyMethod couldn't be called."
原因は、Invokeの指定メソッド名が間違っている。。
Invoke("DelayMethod", 1.0f);
文字列で指定しているから、シンタックスのチェックから漏れやすいのでお気をつけください
開発備忘録
"Trying to Invoke method: HogeManager.DelyMethod couldn't be called."
Invoke("DelayMethod", 1.0f);
文字列で指定しているから、シンタックスのチェックから漏れやすいのでお気をつけください
勘違いして使っていました。
#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
さっきのはあくまでswitch platformで指定しているiOSの条件にものでした。。
Unityで毎回、角度適用の仕方を忘れてしまうので、メモφ(..)メモメモ
transform.Rotate(0,0,addAngle);
// 角度を適用
transform.rotation = Quaternion.Euler(0.0f,0.0f,targetAngle);
transform.rotation = targetAngle; みたいな事はできないのでご注意をw
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の子供の数分foreachで、数えて。表示/非表示
上記のように、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型にしないとエラーになります。
そんな時のC#スクリプト
int enemyAllHp = 0;
GameObject[] targetEnemyObjs;
// foreachで検索する、Enemyタグのオブジェクト。
targetEnemyObjs = GameObject.FindGameObjectsWithTag("Enemy");
foreach(GameObject targetEnemyObj in targetEnemyObjs){
// 敵HPの総数。
enemyAllHp += targetEnemyObj.GetComponent<EnemyController>().enemyHp;
}
地道にループ
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; //高さ
タップした位置に、パズルのピースのようにものを移動する場合。
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);
}
}
MoveTowordsを除けばOK、下記のように。
transform.position = Camera.main.ScreenToWorldPoint(new Vector3(touchX,touchY,10.0f));
Unityを使っていて、ビルド時にいきなりみたことないエラーが表示されたので、
それを解決した際のメモ。
Unityでiosでビルド時に、下記のようなエラーでてビルドできなくなった。
“Error building Player because scripts had compiler errors”
しらべてみたところ、UnityEngineをoverrideしているところで、
エラーになっているようで、対象のUnityEngineを使っているソースを、
通常のScriptsフォルダから、Editorフォルダに移動したら解決した。
ググっても同じような解決策の人がいなかったので、
念のためメモ。