public override void OnStateExcute(float deltaTime) { base.OnStateExcute(deltaTime); if (action.paths.Count > 0) { if (mTargetPoint == null) { mTargetPoint = action.paths.First.Value; mDistance = 0; if (Chess.Instance.grid == BattleGrid.Rect) { var tile = BattleRectGrid.Instance.TileAt(mTargetPoint.destination); if (tile == null || tile.isValid == false) { action.Done(); var point = action.paths.First; while (point != null) { point.Value.Failed(agent); ObjectPool.ReturnInstance(point.Value); point = point.Next; } action.paths.Clear(); mTargetPoint = null; } } else { var tile = BattleHexGrid.Instance.TileAt(mTargetPoint.destination); if (tile == null || tile.isValid == false) { action.Done(); var point = action.paths.First; while (point != null) { point.Value.Failed(agent); ObjectPool.ReturnInstance(point.Value); point = point.Next; } action.paths.Clear(); mTargetPoint = null; } } if (mTargetPoint != null) { //水平移动需要多久 float duration = Vector3.Distance(agent.position, mTargetPoint.destination) / SPEED; if (duration > 0) { float halfTime = duration * 0.5f; float height = Math.Abs(GRAVITY) * halfTime * halfTime / 2; //限制垂直高度 height = Mathf.Clamp(height, MINHEIGHT, MAXHEIGHT); Vector3 center = (agent.position + mTargetPoint.destination) / 2f; center.y = height; List <Vector3> points = new List <Vector3>(); points.Add(agent.position); points.Add(center); points.Add(mTargetPoint.destination); mBezierPath = new BezierPath(points, false, PathSpace.xyz); mVertexPath = new VertexPath(mBezierPath, 0.3f, 0.01f); } else { mTargetPoint.Arrive(agent); ObjectPool.ReturnInstance(mTargetPoint); mTargetPoint = null; action.paths.RemoveFirst(); } } } if (mTargetPoint != null) { Vector3 direction = mTargetPoint.destination - agent.position; agent.position = mVertexPath.GetPointAtDistance(mDistance, EndOfPathInstruction.Stop); direction.y = 0; if (direction != Vector3.zero) { agent.rotation = Quaternion.LookRotation(direction); } mDistance += SPEED * deltaTime; if (mDistance > mVertexPath.length) { agent.position = mTargetPoint.destination; mDistance = 0; mTargetPoint.Arrive(agent); ObjectPool.ReturnInstance(mTargetPoint); mTargetPoint = null; action.paths.RemoveFirst(); } } } else { action.Done(); } }