AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

Unity 2D Roguelike Tutorial動画見たー

Unity - 2D Roguelike tutorial

こちらの動画を全体を通して見ました。
あとソースを見たり、SpriteからAnimation作ってAnimatorの遷移作る当りは実際にやってみました。

勉強になったのは、

  • GameManagerはシングルトンになっている(シーン代わっても永続)

具体的にはこんな感じ
ゲーム起動時はCameraにAddされてるLoaderがGameManagerを生成するんですが、
1面クリアあいて、2面に飛ぶ時に、シーンを再読込するので、
その時に、以下の処理を使って、GameManagerが永続するようになっている

public class GameManager : MonoBehaviour {
  public static GameObject instance=null;
  void Awake()
  {
    if(instance == null)
      instance = this;
    else if(instance!=this)
      Destroy(gameObject);
    DontDestroyOnLoad(gameObject);
  }
}
  • 動く処理は、PlayerとEnemyが継承するabstractなClassになっている

 これはかえってわかりにくい気もしますが、
 おじさんもゾンビも同じ動く所は共通してるので、共通部分をabstractで記述しておいて、
 それぞれ継承して、overrideでmethod書き換えてました。

  • Chopの後は、Idleに自動的になるので、has exit timeがOn

 これは自分がいままで間違ってた。
 これまでのAnimatorでは、例えば、蹴りをすると、timerを使って時間稼いで、
 蹴りが終わった頃に、boolをfalseにして、IDLEに遷移させてましたが、
 考えてみたら、蹴りモーションが終わったら、自動的にIDLEに遷移するようにしておけば
 Script側でtimerを持つ必要はないわけです。
 蹴りに入る場合もtriggerでいい。
 これは勉強になりました。

  • Touch処理

 これは実機で動かしてみたいですが、
 こんな感じの処理。指を動かした時に、動き始めと終わりの間の移動ベクトルから、
 左右と上下どっちに移動させるかを求めて、Playerを動かしている。

if(Input.touchCount>0)
{
  Touch myTouch = Input.touch[0];
  if(myTouch.phase==TouchPhase.Began) touchOrigin = myTouch.position;
  else if(myTouch.phase==TouchPhase.Ended && touchOrigin.x>=0)
  {
    Vector2 touchEnd=myTouch.position;
    float x = touchEnd.x - touchOrigin.x;
    float y = touchEnd.y - touchOrigin.y;
    touchOrigin.x=-1;
    if(Mathf.Abs(x)>Mathf.Abs(y))
      horizontal = x>0 ? 1:-1;
    else
      vertical   = y>0 ? 1:-1;
  }
}
  • 壁を避けて移動する処理

 自分なんかだと内部的に配列もっていて、そこで移動方向をチェックして、
 それに合わせて画像を表示する方向で考えてしまいますが、
 とくにそういう内部配列は無く、PlayerからRaycast2dを飛ばして、
 移動できるなら移動するというやり方でした。
 内部に配列持つと、画像がずれたりして、ZombieのGame作る時に苦しんだので、
 そういうものかもしれません。
 このゲームの壁は、壊せない外周、壊せる内壁、壊せない内壁に別れてます。