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