Unity 3Dモデルが崖の端などに行くと動きが止まるバグを修正する

以下の画像のように、モデルが静止するバグに対応する

f:id:arumogina:20181201025523p:plain

 以下のスクリプトをキャラに適用する。

fps_cnt > 10の数値を弄ればより滑らかになる。

以下のスクリプトはstandard assetsのモーションを適用してる場合なので、state.IsName("Airborne")の部分は適宜読み替えてほしい。基本的に、静止バグ中に適応されてるアニメーション名を入れたらいいはず。

    void Update () {
		fix_fall_bug();
	}

	private
	//崖の端から降りようとするとキャラが動かなくなるバグを治す
	float before_ypt;
	int fps_cnt = 0;
	void fix_fall_bug(){
		Animator m_motion = GetComponent();
		AnimatorStateInfo state = m_motion.GetCurrentAnimatorStateInfo(0);
		if(state.IsName("Airborne")){
			if(fps_cnt == 0) before_ypt = transform.position.y;
			fps_cnt++;
			//Airborneモーション中で、30フレーム経ってもy座標が0.1以下しか動いてない場合は静止バグと判断
			if(fps_cnt > 10){
				if(System.Math.Abs(before_ypt - transform.position.y) < 0.1){
					var dir = transform.forward;//モデルの向きを取得
					var leng = 0.2f;
					//静止バグが起きたら、モデルの向きの方向にleng分移動させる
					transform.position = transform.position + dir * leng;
				}
				fps_cnt = 0;
			}
		}
	}

ただし細い道だとこんな感じになってしまう

f:id:arumogina:20181201160227g:plain