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 距離, 即可知道在路踁上接觸的點.
再以該最近的點(白星) & 最遠的點(黃星) 為指標取得可調整的著陸點(淺藍色)

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
所以決定另外找一個辦法來完成.
(待續)

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