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; }
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)); } }
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);