實作跳過障礙物

實作跳過障礙物

First Attempt : Target Matching

實作 Target Matching 有幾個要點

  • 於 transition 狀態中不能啟動 Target Matching 會被忽視然後出現警告.
  • 如果已經處於 Target Matching 中途出現 transition, 原有的 Target Matching 的處理會被中止.
  • Target Matching 無視物理, 只是單純的於起始點 lerp 到終點. rotation 亦是一樣.

這次嘗試中使利用 Trigger box 來決定起跳及著地點, 利用起跳的瞬間的 Transfrom position/rotation 來決定坐標及面向.
依該坐標向向前順延 2 個 Collider 的 Bound box 距離, 即可知道在路踁上接觸的點.
再以該最近的點(白星) & 最遠的點(黃星) 為指標取得可調整的著陸點(淺藍色)

Extend coordination’s facing to project the landing point.
public bool TryGetLandingPoint(int index, Vector3 pos, Vector3 facing, out Vector3 landingPoint)
{
	landingPoint = Vector3.zero;

	Collider landingZone = index == -1 ? m_DefaultJump.landingZone : m_ExtraConfig[index].landingZone;
	Bounds both = landingZone.bounds;
	both.Encapsulate(m_TriggerArea.bounds);
	float maxDistance = (both.min - both.max).magnitude;

	// Calculate facing adjustment.
	Vector3 virtualPlaneNormal = Vector3.up;
	Vector3 vertor = landingZone.bounds.center - m_TriggerArea.bounds.center;
	Vector3 dir = vertor;
	Vector3.OrthoNormalize(ref dir, ref virtualPlaneNormal);
	Vector3 biasVertor = Vector3.Lerp(dir, facing, 0.5f);
	Vector3 fixedFacing = Vector3.ProjectOnPlane(biasVertor, virtualPlaneNormal).normalized * maxDistance;

	if (m_Debug.gizmos)
	{
		DebugExtend.DrawRay(m_TriggerArea.bounds.center, vertor, Color.blue);
		DebugExtend.DrawRay(m_TriggerArea.bounds.center, virtualPlaneNormal, Color.green);
		DebugExtend.DrawRay(pos, facing * maxDistance, Color.gray);
		DebugExtend.DrawRay(pos, fixedFacing, Color.white);
	}


	Ray ray = new Ray(pos, fixedFacing);
	if (landingZone.bounds.IntersectRay(ray))
	{
		Vector3 near = landingZone.Raycast(ray, out RaycastHit hit, maxDistance) ?
			hit.point :
			Vector3Extend.NearestPointOnLine(ray.origin, ray.direction, landingZone.ClosestPoint(pos));
		Vector3 far = landingZone.ClosestPoint(ray.GetPoint(maxDistance));

		// Project on current direction.
		far = Vector3Extend.NearestPointOnLine(ray.origin, ray.direction, far);
		float weight = index == -1 ? m_DefaultJump.landingWeight : m_ExtraConfig[index].landingWeight;
		landingPoint = Vector3.Lerp(near, far, weight);

		if (m_Debug.gizmos)
		{
			DebugExtend.DrawPoint(near, Color.white, 0.3f);
			DebugExtend.DrawPoint(landingPoint, Color.cyan, 0.3f);
			DebugExtend.DrawPoint(far, Color.yellow, 0.3f);
		}
		return true;
	}
	else
	{
		DebugExtend.DrawRay(pos, fixedFacing, Color.red, 5f);
	}
	return false;
}

簡單來說這次實驗是失敗的, 只能算是功能上完成實際根本到不了 AAA 的水平.
也在 Unity3d Forum 上詢問過好像也沒有更好的辦法.
https://forum.unity.com/threads/how-to-implement-match-target-jump-best-practice.1027060/#post-6659785

所以決定另外找一個辦法來完成.

(待續)

One comment

  1. Pingback: 用 TimeLine 來實作跳越障礙物 – Clonefactor

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料