ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

No.002 進捗状況06

f:id:covory10101101276:20181105214453j:plain
コムローイ祭り -タイ-

 

みなさんこんにちは🌚

いまさらアサシンクリードシンジケートにはまっているブルーノです。洋ゲーは写実的というのかとてもリアルに近い美麗なグラフィックがプレステにマッチしていますね。もちろんXboxやPCという手もあるのですがクオリティに対しての値段や日本人にとっての販売タイトルの身近さが良いですよね。

 

さて今回は前回のプレイヤー周りに取り組むのですが、実は以前友人に制作途中のこのプロジェクトを見てもらったところそんなところはあとでいいからゲームとしての核を先に作れと言われてしまいました笑 というわけで現在改善途中のプレイヤーの挙動をひとまず直したらもうインゲームに取り組んで行こうと思います。というわけで今回は「プレイヤーの動き方」+「インゲーム少し」という内容の投稿になると思います。

 

プレイヤーの挙動

実は作っている間ずっと気になっていたことがあって、Unity標準搭載のEthanくんのアニメーションでは走行時の方向転換の際に後ろ向きに急な角度だといちいちたちどまってから振り向く動作を行うためテンポが悪いなーと思っていました。なのでブレンドツリーをいじってEthanくんからこの振り向く動作を取り除きたいと思います。
f:id:covory10101101276:20181105223636p:plain


EthanのAnimatorにあてられているThirdPersonAnimatorコントローラーを確認します。
f:id:covory10101101276:20181105223814p:plain


AnimatorのGroundedからBlend TreeがあてられているMotionタブからブレンドツリーを確認します。
f:id:covory10101101276:20181105224045p:plain


このブレンドツリーについては実は昔の記事で使い方をざっとやったことがあります。
dreameaters5239.hatenablog.com


 この時のいじり方を参考にたちどまったままの方向転換のモーションを消してみます
f:id:covory10101101276:20181105224303p:plain


おさらいとして、すでにあるモーションを削除するにはそのモーションを該当するひし形かリストから選択し、-ボタンで削除します。だいぶスッキリしましたね。走りながらの急な方向転換もいらないかなと思ったので外側のモーションを全て削除してしまいました。また、まっすぐ走ることが難しかったのでモーション間の間隔を広げることでパッド操作時の敏感な方向転換を鈍くしてみました。
f:id:covory10101101276:20181105224818p:plain
いい感じになりました!成功です!


では本格的にインゲーム作成をしていきたいと思います。

今回は加速装置的な内容をやっていきたいと思います。

加速装置の演出的な部分以外を大別すると

・他の動くものの動きを遅くする

・自分の動きを速くする

ことでそれっぽくしようかなと思います。

一つ目の物体を遅くすることについてはイーサンにPlayerController的なスクリプトをつけ、その中のstaticなbool値とfloat値を設けようと思います。ほかのオブジェクトはそれを参照することでモーションのスピードと加速しているかどうかの2点を変更できます。float値だけで最初はいいんじゃないかとも思いましたが自身は動かないで動作するオブジェクトなどのためにbool値もつけておきました(使うかはわかりませんが)。

それに伴い、以前作ったAudienceControllerも変更しました。
dreameaters5239.hatenablog.com

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudienceController : MonoBehaviour {

	private Animation anim;
	private bool quicker;
	private int motionTimer; //モーションの時間のタイマーと同時に何のモーションをするかを決める。
	private float motionTime; //モーションまでの時間。マックスになったらモーションをし、リセットされる。
	private bool motionBool; //モーションタイマーを進めるかどうか

	// Use this for initialization
	void Start () {
		quicker = false;
		anim = GetComponent<Animation> ();
		motionTimer = Random.Range(5, 10);
		motionTime = 0f;
		motionBool = true;
	}

	// Update is called once per frame
	void Update()
	{
		if(motionBool)
		motionTime += Time.deltaTime; //motionBoolがtrueの時だけタイマーが進む。
		
		if(motionTime > motionTimer)
		{
			motionBool = false;
			StartCoroutine(AudienceAnim(motionTimer));
			motionTime = 0f;
			motionTimer = Random.Range(5, 10);
		}

		if (!anim.isPlaying)
			anim.Play();

		//anim[anim.clip.name].speed = PlayerController.WorldTime; //これじゃダメらしい

		if (PlayerController.QuickTimeSwitch == true && quicker == false)
		{
			foreach (AnimationState a in anim)
			{
				a.speed = PlayerController.WorldTime;
			}
			quicker = true;
		}
		if (PlayerController.QuickTimeSwitch == false)
		{
			foreach (AnimationState a in anim)
            {
                a.speed = PlayerController.WorldTime;
            }
			quicker = false;
		}
	}

	IEnumerator AudienceAnim(int i)
	{
		switch(i)
		{
			case 5:
				anim.CrossFade("applause");
				anim.CrossFadeQueued("idle");
				yield return new WaitForSeconds(2.07f);
				break;
			case 6:
                anim.CrossFade("applause2");
				anim.CrossFadeQueued("idle");
				yield return new WaitForSeconds(2.07f);
                break;
			case 7:
                anim.CrossFade("celebration");
				anim.CrossFadeQueued("idle");
				yield return new WaitForSeconds(2.07f);
                break;
			case 8:
                anim.CrossFade("celebration2");
				anim.CrossFadeQueued("idle");
				yield return new WaitForSeconds(2.07f);
                break;
			case 9:
                anim.CrossFade("celebration3");
				anim.CrossFadeQueued("idle");
				yield return new WaitForSeconds(2.07f);
                break;
		}
		motionBool = true;
		yield return null;
	}
}

なんかソースコード貼り付けられるってことを聞いたんで試してみましたが行番号わからなくて微妙ですね。javaScriptをつかって行数を表示させる方法もあるらしいですがいくらやってもできませんでした。。。また今度😓
Update真ん中のコメントアウトした行(//anim[anim...)のように記述してもうまく機能しなかったので下のように長く書くしかありませんでした。foreach文を毎フレームやるのは負荷が大きいという情報を聞いたのでちょっと長いですが下にその対策をした文を作りました。

では次にプレイヤーの速度をあげようと思います。
f:id:covory10101101276:20181109000338p:plain
ThirdPersonControllerはThirdPersonCharacterというスクリプトコンポーネントがついており、このMoveSpeedMultiplierとAnimSpeedMultiplierがそれぞれモーションと移動速度を変更できるようですね。しかしこのコンポーネントスクリプトの場所が名前空間から違い、参照する場合は少々長くなります。そしてスクリプトをみてみると先ほどの関数たちはSerializeFieldで可視化されたprivate値のようで、外部から変更できないようになっているのでpublicに書き換えます。
f:id:covory10101101276:20181109001853p:plain
そしてこれを操作する記述をPlayerControllerに追加しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;


public class PlayerController : MonoBehaviour {

	public static bool QuickTimeSwitch; //現在加速しているかどうか
	public static float WorldTime; //主人公以外の時間。各アニメーションにはこの変数をかけておくことで加速時にスローにする
	float QuickTimeCount; //現在の加速時間
	public int QuickTimeLimit; //何秒間加速するか設定する
	public UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter TPC;

	// Use this for initialization
	void awake () {
		QuickTimeSwitch = false;
	}

	// Update is called once per frame
	void Update()
	{
		//QuickTimeSwitch = CrossPlatformInputManager.GetButtonUp("Button"); //「Button」に設定しているボタンを使う

		if (Input.GetKeyDown(KeyCode.T) && QuickTimeSwitch == false)
			TimeQuicker();
		
		if (QuickTimeSwitch == true)
		{
			QuickTimeCount += Time.deltaTime;
			if (QuickTimeCount > QuickTimeLimit)
			{
				QuickTimeSwitch = false;
				TPC.m_AnimSpeedMultiplier /= 2;
				TPC.m_GravityMultiplier /= 2;
                TPC.m_MoveSpeedMultiplier /= 2;
				WorldTime = 1f;
				QuickTimeCount = 0;
			}
		}
	}

	void TimeQuicker() {
		QuickTimeSwitch = true;
		TPC.m_AnimSpeedMultiplier *= 2f;
		TPC.m_GravityMultiplier *= 2f;
		TPC.m_MoveSpeedMultiplier *= 2f;
		WorldTime = 0.1f;
	}
}

重力のGravity Multiplierもついでに操作しておきました。

再生してみると。。。
f:id:covory10101101276:20181109003000p:plain
画像ではわかりにくいですがプレイヤーとオーディエンスの速度変更に成功しました!!今回はここまでにしておきます。


Unityでの開発もまだまだままならないですがコンシューマーゲームを作る場合はCやC++が主流と聞きました。そちらの勉強もこれからしていきたいです。