private void Reset() { Mode = JEMAreaMode.HitMask; AgentHeight = 1.8f; AgentSize = 0.4f; HitMask = LayerMask.GetMask("Default"); }
/// <summary> /// Try to random point from this JEM Area component. /// Point generation is unreliable and can end with unsuccessful effect. /// </summary> /// <param name="point"/> /// <param name="forward"/> /// <param name="customMode"/> public bool GenerateUnreliablePoint(out Vector3 point, out Vector3 forward, JEMAreaMode customMode = JEMAreaMode.Unknown) { var prevMode = Mode; if (customMode != JEMAreaMode.Unknown) { Mode = customMode; } point = Vector3.zero; forward = transform.forward; var maxX = _collider.size.x - AgentSize / 2f; var maxZ = _collider.size.z - AgentSize / 2f; var maxY = _collider.size.y - AgentHeight / 2f; switch (Mode) { case JEMAreaMode.Space: var randomPointInSpace = _collider.center + new Vector3 { x = Random.Range(-maxX / 2f, maxX / 2f), y = Random.Range(-maxY / 2f, maxY / 2f), z = Random.Range(-maxZ / 2f, maxZ / 2f) }; randomPointInSpace = transform.TransformPoint(randomPointInSpace); point = randomPointInSpace; switch (ForwardMode) { case JEMAreaForwardMode.Identity: forward = transform.forward; break; case JEMAreaForwardMode.Forward: forward = point - transform.position + _collider.center; break; case JEMAreaForwardMode.ForwardCenter: forward = transform.position + _collider.center - point; break; default: throw new ArgumentOutOfRangeException(); } if (ResetForwardY) { forward.y = 0f; } Mode = prevMode; return(true); case JEMAreaMode.HitMask: var randomPointInTop = _collider.center + new Vector3 { x = Random.Range(-maxX / 2f, maxX / 2f), y = maxY / 2f, z = Random.Range(-maxZ / 2f, maxZ / 2f) }; randomPointInTop = transform.TransformPoint(randomPointInTop); bool hasHit = false; if (RunHitTest(randomPointInTop, out var hitPoint1)) { point = hitPoint1; hasHit = true; } else { var centerPoint = new Vector3(_collider.center.x, _collider.center.y + _collider.size.y / 2f, _collider.center.z); if (RunHitTest(centerPoint, out var hitPoint2)) { point = hitPoint2; hasHit = true; } } if (hasHit) { point.y += AgentHeight / 2f; switch (ForwardMode) { case JEMAreaForwardMode.Identity: forward = transform.forward; break; case JEMAreaForwardMode.Forward: forward = point - transform.position + _collider.center; break; case JEMAreaForwardMode.ForwardCenter: forward = transform.position + _collider.center - point; break; default: throw new ArgumentOutOfRangeException(); } if (ResetForwardY) { forward.y = 0f; } Mode = prevMode; return(true); } break; default: throw new ArgumentOutOfRangeException(); } Mode = prevMode; return(false); }