Unityでジャンクゲームを作っているっぽい

会社帰りにGPD PocketにUnity入れてゲーム作ってます

【2DのTest】11_dashしたい

やっぱり、dashは必要なので実装したい
方針は

  1. ボタンを入力
  2. dash modeに入る
  3. 一定時間移動速度up
  4. (後々)方向転換できなくする
  5. 一定時間で終了

player_move.csを編集

dash用の速度を指定

public float dashSpeed;

animationCurveを使わないとダメそうなので用意

public AnimationCurve dashMoveCurve;

dash時flagも用意

private bool isDash;	//Dash時flag

dash時間のカウント用変数

private float dashTimeElapsed = 0.0f;	//dash時間カウント用
public float timeDash;			//dash時間
private float dashTime;			//dashMoveグラフ制御用

左shift keyをdashボタンにする

ジャンプしていない時に入力する事でisDashフラグをonにして
dash時間のカウントを開始
設定時間までカウントしたら、isDashフラグをoffにする

		if(Input.GetKey(KeyCode.LeftShift) && isDash == false){
			if(isJump == false){
				isDash = true;
			}
		}
		//dash制限時間カウント
		if(isDash == true){
			dashTimeElapsed += Time.deltaTime;	//カウント
			if(dashTimeElapsed >= timeDash){
				Debug.Log("dash off");
				dashTimeElapsed = 0.0f;		//初期化
				isDash = false;			//dashflag off	
			}
		}

dashフラグで左右入力部分にdash用の判定を追加

		if(horizontalKey > 0){
			if(isJump == true){
				jumpMoveTime += Time.deltaTime;	//jumpMove時間のカウント
				xSpeed = speed;
			}else if(isDash == true){
				dashTime += Time.deltaTime;	//dash時間のカウント
				xSpeed = dashSpeed;
			}else{
				walkTime += Time.deltaTime;	//walk時間のカウント
				xSpeed = speed;
			}
		}
		//左入力
		else if(horizontalKey < 0){
			if(isJump == true){
				jumpMoveTime += Time.deltaTime;	//jumpMove時間のカウント
				xSpeed = -speed;
			}else if(isDash == true){
				dashTime += Time.deltaTime;		//dash時間のカウント
				xSpeed = -dashSpeed;
			}else{
				walkTime += Time.deltaTime;		//walk時間のカウント
				xSpeed = -speed;
			}
		}

最後にanimationCurveを反映させる部分にdashの時の判定を追加

		if(isJump == true){
			xSpeed *= jumpMoveCurve.Evaluate(jumpMoveTime);
			ySpeed *= jumpCurve.Evaluate(jumpTime);
		}else if(isDash == true){
			//dash時
			xSpeed *= jumpMoveCurve.Evaluate(dashTime);
		}else{
			//walk時
			xSpeed *= walkCurve.Evaluate(walkTime);
		}

animationCurveはこんな感じにしてみた

f:id:mekatamatama:20210305215311p:plain

dashできました

イイ感じ
f:id:mekatamatama:20210305215534g:plain:h300

player_move.csの全体はこんな感じ

github.com

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

public class player_move : MonoBehaviour{
	public float speed;						//速度
	public float dashSpeed;					//dash速度
	private Rigidbody2D rb = null;
	public player_groundCheck groundCheck;	//他のオブジェクトのスクリプト入れる用
	public float gravity;					//重力
	public float jumpSpeed;					//jump力
	private bool isGround = false;			//接地flag移動用
	private bool isJump = false;
	private float jumpPos = 0.0f;			//jump開始時のyを保存
	public float jumpHight;					//jumpする高さ
	public AnimationCurve walkCurve;		//walk用
	public AnimationCurve dashMoveCurve;	//dash中の左右移動用
	public AnimationCurve jumpCurve;		//jump用
	public AnimationCurve jumpMoveCurve;	//jump中の左右移動用
	private float walkTime;					//walkグラフ制御用
	private float beforeKey;				//入力方向save用
	private float jumpTime;					//jumpグラフ制御用
	public float jumpLimitTime;				//jump制限時間
	private float jumpMoveTime;				//jumpMoveグラフ制御用
	private bool isReleaseJumpBtn;			//jumpボタン離したflag
	private bool isMove;					//移動制御flag
	private bool isLanding;					//着地時flag
	private bool isDash;					//Dash時flag
	private float timeElapsed = 0.0f;		//停止時間カウント用
	public float timeStop;					//停止時間
	private float dashTimeElapsed = 0.0f;	//dash時間カウント用
	public float timeDash;					//dash時間
	private float dashTime;					//dashMoveグラフ制御用

    void Start(){
		rb = GetComponent<Rigidbody2D>();	//Rigidbody2D取得
		isMove = true;						//初期化
	}

	//物理演算用
	void FixedUpdate(){
		//接地判定確認
		isGround = groundCheck.IsGround();	//groundCheckスクリプトにアクセス

		//キー入力
		float horizontalKey = Input.GetAxis("Horizontal");
		float xSpeed = 0.0f;		//初期化
		//重力発生
		float ySpeed = -gravity;	//下方向に力を発生

		//右入力
		if(horizontalKey > 0){
			if(isJump == true){
				jumpMoveTime += Time.deltaTime;	//jumpMove時間のカウント
				xSpeed = speed;
			}else if(isDash == true){
				dashTime += Time.deltaTime;		//dash時間のカウント
				xSpeed = dashSpeed;
			}else{
				walkTime += Time.deltaTime;		//walk時間のカウント
				xSpeed = speed;
			}
//			xSpeed = speed;
		}
		//左入力
		else if(horizontalKey < 0){
			if(isJump == true){
				jumpMoveTime += Time.deltaTime;	//jumpMove時間のカウント
				xSpeed = -speed;
			}else if(isDash == true){
				dashTime += Time.deltaTime;		//dash時間のカウント
				xSpeed = -dashSpeed;
			}else{
				walkTime += Time.deltaTime;		//walk時間のカウント
				xSpeed = -speed;
			}
//			xSpeed = -speed;
		}
		//無入力
		else{
			walkTime = 0.0f;			//walk時間のリセット
			xSpeed = 0.0f;
		}

		//dash入力(左shift key)
		if(Input.GetKey(KeyCode.LeftShift) && isDash == false){
			if(isJump == false){
				isDash = true;
			}
		}
		//dash制限時間カウント
		if(isDash == true){
			dashTimeElapsed += Time.deltaTime;	//カウント
			if(dashTimeElapsed >= timeDash){
				Debug.Log("dash off");
				dashTimeElapsed = 0.0f;		//初期化
				isDash = false;				//dashflag off	
			}
		}
		
		//左右移動反転時のwalkTimeの処理
		//左入力から右入力に反転時
		if(horizontalKey > 0 && beforeKey < 0){
			walkTime = 0.0f;			//walk時間のリセット
		}
		//右入力から左入力に反転時
		else if(horizontalKey < 0 && beforeKey > 0){
			walkTime = 0.0f;			//walk時間のリセット
		}
		beforeKey = horizontalKey;	//入力方向save

		//接地判定
		if(isGround == true){	//接地時
			//jumpキー入力やめたか判定
			if(Input.GetKeyUp(KeyCode.Space)){
				isReleaseJumpBtn = true;
			}

		//jumpから着地した時
		if(isJump == false && isLanding == true){
			isMove = false;				//移動flag off
			//停止時間判定
			timeElapsed += Time.deltaTime;	//カウント
			if(timeElapsed >= timeStop){
				isMove = true;				//移動許可
				timeElapsed = 0.0f;			//初期化
				isLanding = false;			//着地flag off	
			}
		}

			//jump入力
			if(Input.GetKey(KeyCode.Space) && isReleaseJumpBtn == true){
				ySpeed = jumpSpeed;
				jumpPos = transform.position.y;	//jump開始時のy保存
				isJump = true;					//jump flag on
				jumpTime = 0.0f;				//jump時間のリセット
				jumpMoveTime = 0.0f;			//jumpMove時間のリセット
			}else{
				isJump = false;	//jump flag off
			}
		}
		else if(isJump == true){		//接地してなくてjump中の時
			//jump制御用private変数
			bool jumpKey = false;
			bool canHigh = false;
			bool canTime = false;
			//jumpボタンを入力しているか
			if(Input.GetKey(KeyCode.Space)){
				jumpKey = true;		//flag on
			}
			//jumpしたい高さより低いか
			if(jumpPos + jumpHight > transform.position.y){
				canHigh = true;	//flag on
			}
			//jump時間は長くないか
			if(jumpLimitTime > jumpTime){
				canTime = true;	//flag on
			}

			//まだjumpできる場合
			if(jumpKey && canHigh && canTime){
				ySpeed = jumpSpeed;
				jumpTime += Time.deltaTime;	//jump時間カウント
			}
			//jump不可
			else{
				isJump = false;
				jumpTime = 0.0f;			//jump時間リセット
				isReleaseJumpBtn = false;	//接地してもjumpボタンを離してない
				isLanding = true;			//着地flag on
			}
		}

		//AnimationCurveを速度に反映
		//jump時
		if(isJump == true){
			xSpeed *= jumpMoveCurve.Evaluate(jumpMoveTime);
			ySpeed *= jumpCurve.Evaluate(jumpTime);
		}else if(isDash == true){
			//dash時
			xSpeed *= jumpMoveCurve.Evaluate(dashTime);
		}else{
			Debug.Log("walk");
			//walk時
			xSpeed *= walkCurve.Evaluate(walkTime);
		}

		//移動flag判定 
		if(isMove == true){
			//実際に移動
			rb.velocity = new Vector2(xSpeed, ySpeed);
		}else{
			rb.velocity = new Vector2(0.0f, 0.0f);
		}
	}
}