public void PrepareParachuteData(NodeAddedEvent e, BonusWithParachuteNode bonus)
        {
            BonusDataComponent bonusData = bonus.bonusData;

            bonusData.ParachuteHalfHeight = bonus.bonusParachuteInstance.BonusParachuteInstance.GetComponentInChildren <Renderer>().bounds.size.y * 0.5f;
            bonusData.SwingPivotY         = bonusData.BoxHeight + bonusData.ParachuteHalfHeight;
        }
Beispiel #2
0
        public void BoxAlignmentToGround(UpdateEvent e, BonusBoxAlignmentToGroundNode bonus)
        {
            BonusDataComponent bonusData = bonus.bonusData;
            Transform          transform = bonus.bonusBoxInstance.BonusBoxInstance.transform;
            float angle = (bonus.bonusConfig.AlignmentToGroundAngularSpeed * ((Date.Now - bonus.bonusDropTime.DropTime) - bonus.bonusData.FallDuration)) - Vector3.Angle(transform.TransformDirection(Vector3.up), Vector3.up);

            transform.RotateAround(bonusData.LandingPoint, bonusData.LandingAxis, angle);
            if (Vector3.Angle(bonus.bonusData.GroundPointNormal, transform.TransformDirection(Vector3.up)) <= angle)
            {
                bonus.Entity.RemoveComponent <BonusAlignmentToGroundStateComponent>();
            }
        }
        private static void CalculateLandingPivot(Vector3 spawnPosition, ref BonusDataComponent bonusData)
        {
            RaycastHit hit;
            Vector3    normalized = Vector3.Cross(bonusData.GroundPointNormal, Vector3.up).normalized;
            Vector3    vector3    = Vector3.Cross(normalized, bonusData.GroundPointNormal);
            Vector3    vector4    = Vector3.Cross(normalized, Vector3.up);
            Vector3    origin     = spawnPosition + ((vector4 * bonusData.BoxHeight) * 0.5f);

            bonusData.LandingPoint = bonusData.GroundPoint + (vector3 * ((bonusData.BoxHeight * 0.5f) / bonusData.GroundPointNormal.y));
            if (Physics.Raycast(origin, Vector3.down, out hit, float.PositiveInfinity, LayerMasks.STATIC) && ((bonusData.GroundPoint.y < hit.point.y) && (hit.point.y < bonusData.LandingPoint.y)))
            {
                bonusData.LandingPoint += vector3 * ((((bonusData.BoxHeight * 0.5f) / bonusData.GroundPointNormal.y) * (bonusData.LandingPoint.y - hit.point.y)) / (bonusData.LandingPoint.y - bonusData.GroundPoint.y));
            }
        }
Beispiel #4
0
        public void BoxAlignmentToGround(NodeRemoveEvent e, BonusBoxAlignmentToGroundNode bonus)
        {
            GameObject bonusBoxInstance = bonus.bonusBoxInstance.BonusBoxInstance;

            if (bonusBoxInstance)
            {
                BonusDataComponent bonusData = bonus.bonusData;
                Transform          transform = bonusBoxInstance.transform;
                float angle = Vector3.Angle(bonusData.GroundPointNormal, transform.TransformDirection(Vector3.up));
                transform.RotateAround(bonusData.LandingPoint, bonusData.LandingAxis, angle);
                Vector3 eulerAngles = transform.eulerAngles;
                eulerAngles.y         = bonus.rotation.RotationEuler.y + (bonusData.FallDuration * bonus.bonusConfig.AngularSpeed);
                transform.eulerAngles = eulerAngles;
            }
        }
        private static void CalculateGroundPointAndNormal(Vector3 spawnPosition, BonusDataComponent bonusData, BonusBoxInstantiatedNode bonus)
        {
            RaycastHit hit;

            if (!Physics.Raycast(spawnPosition, Vector3.down, out hit, float.PositiveInfinity, LayerMasks.STATIC))
            {
                bonusData.GroundPoint       = spawnPosition;
                bonusData.GroundPointNormal = Vector3.up;
            }
            else
            {
                bonusData.GroundPoint        = hit.point;
                bonusData.GroundPointNormal  = hit.normal;
                bonus.rotation.RotationEuler = hit.transform.eulerAngles;
            }
        }
        public void PrepareBonusBoxData(NodeAddedEvent e, BonusBoxInstantiatedNode bonus)
        {
            BonusDataComponent bonusData = new BonusDataComponent();
            Vector3            position  = bonus.position.Position;

            bonusData.BoxHeight = bonus.bonusBoxInstance.BonusBoxInstance.GetComponent <BoxCollider>().size.y;
            CalculateGroundPointAndNormal(position, bonusData, bonus);
            CalculateLandingPivot(position, ref bonusData);
            bonusData.FallDuration = (position.y - bonusData.LandingPoint.y) / bonus.bonusConfig.FallSpeed;
            if (bonusData.GroundPointNormal != Vector3.up)
            {
                bonusData.AlignmentToGroundDuration = (Mathf.Acos(bonusData.GroundPointNormal.y) * 57.29578f) / bonus.bonusConfig.AlignmentToGroundAngularSpeed;
                bonusData.LandingAxis = Vector3.Cross(Vector3.up, bonusData.GroundPointNormal);
            }
            bonus.Entity.AddComponent(bonusData);
        }
        private void UpdateBonusPosition(BonusFallingNode bonus)
        {
            GameObject bonusBoxInstance = bonus.bonusBoxInstance.BonusBoxInstance;

            if (bonusBoxInstance)
            {
                BonusConfigComponent bonusConfig = bonus.bonusConfig;
                BonusDataComponent   bonusData   = bonus.bonusData;
                float   num   = Mathf.Clamp((float)(Date.Now - bonus.bonusDropTime.DropTime), 0f, bonusData.FallDuration);
                Vector3 euler = new Vector3(bonusConfig.SwingAngle * Mathf.Sin(bonusConfig.SwingFreq * (bonusData.FallDuration - num)), bonus.rotation.RotationEuler.y + (bonusConfig.AngularSpeed * num), bonusBoxInstance.transform.eulerAngles.z);
                bonusBoxInstance.transform.rotation = Quaternion.Euler(euler);
                Vector3 vector4 = MathUtil.SetRotationMatrix(bonusBoxInstance.transform.eulerAngles * 0.01745329f).MultiplyPoint3x4(Vector3.down);
                bonusBoxInstance.transform.position = new Vector3(bonus.position.Position.x + (bonusData.SwingPivotY * vector4.x), bonus.position.Position.y - (bonusConfig.FallSpeed * num), bonus.position.Position.z + (bonusData.SwingPivotY * vector4.z));
                if (num.Equals(bonusData.FallDuration))
                {
                    this.ToAlignmentToGroundState(bonus.Entity);
                }
            }
        }
 private bool IsOnGround(Vector3 position, BonusDataComponent bonusData, BonusDropTimeComponent bonusDropTime) =>
 MathUtil.NearlyEqual(Date.Now.GetProgress(bonusDropTime.DropTime + bonusData.FallDuration, bonusData.AlignmentToGroundDuration), 1f, 0.01f);