2011年9月29日木曜日

セーブデータの作り方

Unityでプレイヤーの状態とか、どこにいるとか、いわゆるセーブデータを作る必要があるなぁと思って、どうしたらいいかなぁと考えてました

困ったときのUnity Answersにスレッドがありました
http://answers.unity3d.com/questions/8480/how-to-scrip-a-saveload-game-option.html#

何も考えずちょっと下にあるコードをコピペして、何とかなります
バイナリデータにシリアライズして、読み込み時にデシリアライズしているんでしょうか
詳しい挙動は把握していませんが、ちゃんと変数の状態が保存されていました

別のセーブデータ作成方法

PlayerPrefsってクラスがUnity側で用意されていて
これがセーブデータを作成してくれるようです
http://unity3d.com/support/documentation/ScriptReference/PlayerPrefs.html
WebPlayerだと1MBまでのファイルサイズ制限があるみたい?
これを利用する方が楽だと思います。

2011年9月23日金曜日

ヒエラルキーペインの整理方法

オブジェクトをどんどん作ってヒエラルキーペインに追加していくことになるのですが
同じカテゴリのオブジェクトがどんどん溜まっていくと、ヒエラルキーペインがいっぱいいっぱいで見づらくなってきました。

フォルダー的な役割できないかなーと思っていて、考えつきました

1.空のGameObject作る
2.Folder_***な適当な名前にする
3.そのGameObjectに実際のGameObjectを入れる

これで整理できて見やすくなりますね。

2011年9月21日水曜日

rigidbody.AddForceで動かしたい

rigidbody.AddForceで瞬間的に力入れて動かしたいと思って、あるメソッドから
GameObject obj = (GameObject)Instantiate(gems[type], pos + dir, gameObject.transform.rotation);
obj.rigidbody.AddForce(Vector3.one * 10.0f);

とかで呼んでいたのですが、どうにも動いてるように見えない。
第二引数にForceModeがあるんですね。これがForceMode.Forceになっているようです

ググッて参考にしたところ
http://code.google.com/p/vga-unity/wiki/GP10UnityCourse04

で、ForeceMode.Impulseを指定して呼び出してやると、動くようになりました

2011年9月14日水曜日

Destroyの問題

ゲーム中で何かアイテムを使用するメソッドがあります。
アイテムの効果を実行します。
効果音を再生するようGetComponent<Audiosource>().Play()を行います。
使ったので、そのままDestroy(gameObject)します。

効果音再生がされずにDestroyされました。


GameObjectがDestroyされると効果音再生が終了されるようです。
コンポーネントが消えるからでしょうか。

とりあえず自分で困ったとこを対処したのは
renderer.enabledとcollider.enabledをfalseにする。
Destroyフラグを立てる。

フラグと効果音の再生終了を見て、Destroyを実行する。
描画とコリジョンが無効になるので、これで自分としては困らないかなー

追記
AudioSource.PlayClipAtPoint(AudioClip, Vector3)を使用すれば
効果音再生終了と同時にDestroyしてくれるGameObjectが生成されました。
上記のまどろっこしいことしなくても、このメソッドで一発解決です

2011年9月11日日曜日

Dropboxのhtmlへ直リン

Dropboxを利用してみました。2GBまで無料で使えるオンラインストレージです。
ファイルへの直リンが可能ということで、WebPlayerビルドしたUnityゲームを公開する手段に使えるかなーと。
 下記ファイルでテスト

公開終了

うまくいきましたー

2011年9月2日金曜日

UnityC# + LINQ

C#3.0の機能LINQが使えました。
LINQはデータベース言語のようですね
詳しくはこの辺
http://ufcpp.net/study/csharp/sp3_linq.html

uinsg System.Linq;
でクエリ文が使えるようになって、あれこれデータ作り。

試作データはこんな感じに
{攻撃名, 攻撃データ}
攻撃名でアクセスしてデータを引っ張ってくる。
LINQ使う必要がないけど、使いたかった。

試作クラスは以下の通り。
public class PlayerAttackData : MonoBehaviour {
   
    enum AttackCode{ONE, TWO, THREE};
    class AttackData{
        public int Power{
            get;
            set;
        }
        public int Frame{
            get;
            set;
        }
       
        public AttackData(int power, int frame){
            Power = power;
            Frame = frame;
        }
    }
   
    class AttackInfo{
        public AttackCode Code{
            get;
            set;
        }
       
        public AttackData Data{
            get;
            set;
        }

        public AttackInfo(AttackCode code, AttackData data){
            Code = code;
            Data = data;
        }
    }
    AttackInfo[] attack_infos = new AttackInfo[2];

    // Use this for initialization
    void Start () {
        //Define Data
        attack_infos[0] = new AttackInfo(AttackCode.ONE, new AttackData(15, 10));
        attack_infos[1] = new AttackInfo(AttackCode.TWO, new AttackData(10, 5));
       
        AttackCode now_attack_code = PlayerAttackData.AttackCode.ONE;
        var attack_info =
            from p in attack_infos
                where p.Code == now_attack_code
                select p.Data;
        AttackData data = (AttackData)attack_info;
        Debug.Log(data.Frame);
    }
   
    // Update is called once per frame
    void Update () {
   
    }
}
このガジェットでエラーが発生しました