こちらの動画を全体を通して見ました。
あとソースを見たり、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作る時に苦しんだので、
そういうものかもしれません。
このゲームの壁は、壊せない外周、壊せる内壁、壊せない内壁に別れてます。