private Vector3 GetCharacterDirectllyColliderVector(JSCharacterCollider collider, Vector3 start, Vector3 end, float radius) { crossPoint.Clear(); LineCircleCrossPoint(start, end, collider.ColliderCenterTransform.position, collider.SelfCollider.radius + radius); if (crossPoint.Count > 0) { return(crossPoint [0] + Vector3.Normalize(start - end) * Mathf.Sqrt(Mathf.Pow(collider.SelfCollider.radius + radius, 2.0f) - Mathf.Pow(Vector3.Distance(collider.colliderCenterTransform.position, crossPoint [0]), 2.0f))); } return(end); }
private Vector3 ClosestVectorBetweenCharacterAndObstacle(JSCharacterCollider character, JSObstacleCollider obstacle, Vector3 start, float radius, List <Vector3> vectorInDirection) { Vector3[] obstacleVertexs = new Vector3[4]; Vector3 closestVector = Vector3.zero; float closestDistance = 0; float vectorDistance = 0; obstacleVertexs [0] = new Vector3(obstacle.SelfCollider.size.x * 0.5f + radius, // obstacle.ColliderCenterTransform.position.y - start.y, 0, obstacle.SelfCollider.size.z * 0.5f + radius); obstacleVertexs [1] = new Vector3(obstacle.SelfCollider.size.x * 0.5f + radius, // obstacle.ColliderCenterTransform.position.y - start.y, 0, -obstacle.SelfCollider.size.z * 0.5f - radius); obstacleVertexs [2] = new Vector3(-obstacle.SelfCollider.size.x * 0.5f - radius, // obstacle.ColliderCenterTransform.position.y - start.y, 0, obstacle.SelfCollider.size.z * 0.5f + radius); obstacleVertexs [3] = new Vector3(-obstacle.SelfCollider.size.x * 0.5f - radius, // obstacle.ColliderCenterTransform.position.y - start.y, 0, -obstacle.SelfCollider.size.z * 0.5f - radius); obstacleVertexs [0] = obstacle.ColliderCenterTransform.TransformPoint(obstacleVertexs [0]); obstacleVertexs [1] = obstacle.ColliderCenterTransform.TransformPoint(obstacleVertexs [1]); obstacleVertexs [2] = obstacle.ColliderCenterTransform.TransformPoint(obstacleVertexs [2]); obstacleVertexs [3] = obstacle.ColliderCenterTransform.TransformPoint(obstacleVertexs [3]); for (int i = 0; i < obstacleVertexs.Length; ++i) { if (!vectorInDirection.Contains(obstacleVertexs [i])) { closestVector = obstacleVertexs [i]; break; } } closestDistance = Vector3.Distance(start, closestVector); vectorDistance = 0; for (int i = 0; i < obstacleVertexs.Length; ++i) { if (!vectorInDirection.Contains(obstacleVertexs [i]) && CheckColliderVector(obstacleVertexs [i], character.SelfCollider.bounds.size)) { vectorDistance = Vector3.Distance(start, obstacleVertexs [i]); if (vectorDistance < closestDistance) { closestDistance = vectorDistance; closestVector = obstacleVertexs [i]; } } } return(closestVector); }
private Vector3 ClosestVectorBetweenCharacterAndCharacter(JSCharacterCollider character, JSCharacterCollider obstacle, Vector3 start, Vector3 end, List <Vector3> vectorInDirection) { Vector3[] obstacleVertexs = new Vector3[2]; Vector3 centerDiretcionVector = Vector3.Normalize(obstacle.ColliderCenterTransform.position - character.ColliderCenterTransform.position); Vector3 closestVector = Vector3.zero; float closestDistance = 0; float vectorDistance = 0; float characterRadius = Sqrt2 * character.SelfCollider.radius; float obstacleRadius = Sqrt2 * obstacle.SelfCollider.radius; obstacleVertexs [0] = obstacle.ColliderCenterTransform.position + VerticalQuaternionUp * centerDiretcionVector * (obstacleRadius + characterRadius); obstacleVertexs [1] = obstacle.ColliderCenterTransform.position + VerticalQuaternionDown * centerDiretcionVector * (obstacleRadius + characterRadius); for (int i = 0; i < obstacleVertexs.Length; ++i) { if (!vectorInDirection.Contains(obstacleVertexs [i]) && CheckColliderVector(obstacleVertexs [i], character.SelfCollider.bounds.size)) { closestVector = obstacleVertexs [i]; break; } } closestDistance = Vector3.Distance(end, closestVector); for (int i = 0; i < obstacleVertexs.Length; ++i) { if (!vectorInDirection.Contains(obstacleVertexs [i]) && CheckColliderVector(obstacleVertexs [i], character.SelfCollider.bounds.size)) { vectorDistance = Vector3.Distance(end, obstacleVertexs [i]); if (vectorDistance < closestDistance) { closestDistance = vectorDistance; closestVector = obstacleVertexs [i]; } } } return(closestVector); }