Ejemplo n.º 1
0
        private void Reset()
        {
            Mode        = JEMAreaMode.HitMask;
            AgentHeight = 1.8f;
            AgentSize   = 0.4f;

            HitMask = LayerMask.GetMask("Default");
        }
Ejemplo n.º 2
0
        /// <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);
        }