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

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

複数の武器をもたせて切り替える処理

f:id:yasu9780:20161116232903p:plain

実行時に、Startで武器の塊を読み込んで、右手の骨にセットする。
キャラクターによって位置や向きが微妙に違うので、キャラごとに微調整する

void Start () {
    rb = GetComponent<Rigidbody>();
    anim = GetComponent<Animator>();

Transform Rhand = anim.GetBoneTransform(HumanBodyBones.RightHand);
GameObject RhandPos = Instantiate((GameObject)Resources.Load("RhandPosition"), Vector3.zero, Quaternion.identity) as GameObject;
RhandPos.transform.SetParent(Rhand);
RhandPos.transform.position = Rhand.position;

if (charaNo == 4) //overload
{
    RhandPos.transform.localRotation = Quaternion.Euler(new Vector3(316,81.82f,173.7f));
    RhandPos.transform.localPosition = new Vector3(-0.0142f,0.001f,-0.1713f);
}


emptyオブジェクトをRhandPositionと改名して、複数の武器を子供として登録して、一つの塊のPrefabにしておく。
剣、ハンマー、拳銃、サブマシンガン、ロケットランチャー、ライフルなど、6種の武器を重ねている。
握りの部分でまとめておくのがミソ。
ぶきを追加するときは、握りを重ねて、塊Prefabに追加するだけで済む。
武器選択のコードも追加がいるが、GUI的な修正が必要最小限で済む。
f:id:yasu9780:20161116232908p:plain



使用する武器によってその武器のActiveを切り替える
f:id:yasu9780:20161116232912p:plain

if (weapon == 1) RhandPos.transform.FindChild("Medieval Sward").gameObject.SetActive(true);
if (weapon == 2) RhandPos.transform.FindChild("RunicStoneHammer_Iron_Low").gameObject.SetActive(true);
if (weapon == 3) RhandPos.transform.FindChild("PM-40_Variant3").gameObject.SetActive(true);
if (weapon == 4) RhandPos.transform.FindChild("CQAssaultRifle").gameObject.SetActive(true);
if (weapon == 5) RhandPos.transform.FindChild("german_smg_a").gameObject.SetActive(true);
if (weapon == 6) RhandPos.transform.FindChild("RocketLauncher_Mobile").gameObject.SetActive(true);

HPインジケーターもStartで読み込んで、頭のボーンを取得して、その上に設定する。

Transform Head = anim.GetBoneTransform(HumanBodyBones.Head);
GameObject hpBar = Instantiate((GameObject)Resources.Load("Canvas"), Vector3.zero, Quaternion.identity) as GameObject;
hpBar.transform.SetParent(this.transform);
hpBar.transform.position = Head.position + Vector3.up * 0.5f;

アニメーションも増えてくるとAnimatorで変数を登録してTrantion作るのが面倒なので、AnyStateを活用する。
f:id:yasu9780:20161116232916p:plain
繰り返し処理であるIdleやWalk、Runなどは、通常のステート処理として、
キックや剣を振る、銃を撃つなどの一時的な動作はAnyStateから呼び出す。
これはInteger変数一つで分岐先を切り替えられるので、ステート管理用の変数が増えないので管理が楽。
遷移も一方方向なのでAnimatorの登録作業も簡単。

歩行と走行はfloatのSpeed変数で切り替えるようにAnimatorで遷移を作ってみた。
今まではコードの方でSetBoolでステートを管理していた。
また、通常の歩行とゾンビ方向を別の遷移とした。
本来はAnimatorを分けるか、Layerなどを変えるのかもしれないけど。
面倒くさいの一つにまとめてみた。
男性キャラと女性キャラでも移動アニメーションを分けようと思う。


f:id:yasu9780:20161117000940p:plain
銃で狙いをつけながら歩くモーション。
上半身と下半身をマスクで分けて、歩行と銃構えを合成する方向もあるのだろうけど、ちょっと面倒ですよね。



yasu9780.hatenablog.com