private void OnTriggerEnter2D(Collider2D other) { bool canInteract = Mathf.Abs(lastInteractionTime - Time.time) > interactionDelay; if (canInteract && other.CompareTag("CirclePart")) { lastInteractionTime = Time.time; Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, radius, circlePartsLayer); if (colliders.Length > 0) { for (int i = 0; i < colliders.Length; i++) { other = colliders.ElementAt(i); CirclePart circlePart = other.gameObject.GetComponent <CirclePart>(); if (i == 0) { circlePart.playerInteraction(reflecting); circlePartInteraction(circlePart); } else { circlePart.bounce(); } } } } }
public void circlePartInteraction(CirclePart part) { if (reflecting) { return; } if (part.state == CirclePart.CirclePartState.Default || part.state == CirclePart.CirclePartState.Reload) { if (sprite.color == part.color) { comboCount++; } else { comboCount = 1; } sprite.color = part.color; rb2d.velocity = Vector2.up * force; bool combo = comboCount >= circle.playerComboCount; if (combo) { comboCount = 0; StartCoroutine(_reflect(circle.getReflectionPoints())); } ParticleSystem.MainModule main = jumpPs.main; main.startColor = sprite.color; jumpPs.Play(); interactedWithCircle?.Invoke(comboCount, combo, part.state == CirclePart.CirclePartState.Reload); } else if (part.state == CirclePart.CirclePartState.Spike) { die(DieType.Spike); } }
private void prepareCircleParts() { parts.ForEach(part => Destroy(part.gameObject)); parts.Clear(); float angle = 0; List <CirclePartType> partTypes = randomPartTypes(); #region Spikes Difficulty int level = gameController.score.level; int spikesCount = 0; switch (level) { case int lvl when level <= 3: { spikesCount = 0; break; } case int lvl when level > 3 && level < 25: { spikesCount = Range(1, 3 + 1); break; } case int lvl when level >= 25: { spikesCount = Range(2, 4 + 1); break; } case int lvl when level >= 50: { spikesCount = Range(3, 5 + 1); break; } default: break; } int count = partTypes.Count(partType => isTruePartType(partType)); spikesCount = Mathf.Clamp(spikesCount, 0, (int)(count / 2f) - 1); if (count <= 5) { spikesCount = 1; } if (count >= 7) { partsReloadTime = 2.25f; } else { partsReloadTime = 1.5f; } #endregion int spikesSpawned = 0; for (int i = 0; i < partTypes.Count; i++) { CirclePartType partType = partTypes.ElementAt(i); if (i > 0) { CirclePartType previousPartType = partTypes.ElementAt(i - 1); int partTypeValue = truePartValue(partType); int previousPartTypeValue = truePartValue(previousPartType); // get true values of angle cost int difference = Mathf.Abs(partTypeValue - previousPartTypeValue); float differenceAngle = (difference * deltaPartCost); if (partTypeValue < previousPartTypeValue) { differenceAngle = -differenceAngle; } else if (partTypeValue == previousPartTypeValue) { differenceAngle = 0f; } angle += differenceAngle; } float radius = c2d.radius; float x = radius * Mathf.Cos(angle * Mathf.Deg2Rad); float y = radius * Mathf.Sin(angle * Mathf.Deg2Rad); Vector3 point = new Vector3(x, y, 0); CirclePart partPrefab = circlePartPrefab(partType); if (partPrefab != null) { CirclePart part = Instantiate(partPrefab, point, Quaternion.AngleAxis(angle, Vector3.forward)); part.transform.position = part.transform.position + transform.position; bool spawnSpike = false; if (spikesSpawned < spikesCount) { float chance = (i + 1) * (100f / partTypes.Count); if (Range(0f, 100f) <= chance) { spikesSpawned++; spawnSpike = true; } } part.setupCircle(this, spawnSpike ? CirclePart.CirclePartState.Spike : CirclePart.CirclePartState.Default); parts.Add(part); } angle += circlePartCost(partType); } }
void OnTriggerEnter2D(Collider2D col) { if (isGameOver) { return; } //Debug.LogError(col+" layer "+ col.GetComponent<SpriteRenderer>().sortingLayerID); //1746648709 ??? if (col.GetComponent <SpriteRenderer>() != null && col.GetComponent <SpriteRenderer>().sortingLayerID != 1746648709) { return; } if (decideByTheFirstHit && col.transform.parent && hittedCircle.Contains(col.transform.parent.gameObject)) { return; } if (willTeleportThis) { return; } GameColor script = col.gameObject.GetComponent <GameColor>(); CirclePart cp = col.gameObject.GetComponent <CirclePart>(); if (script && cp) { GameColorEnum c = script.gameColor; if (cp.willChange) { ChangeColor(c); } else { if (c != gameColor) { HitWontChangePartWithDifferentColor(); } else { HitWontChangePartWithSameColor(); //achievement } } if (shouldDestroyPart) { col.gameObject.SetActive(false); hittedPart.Add(col.gameObject); } if (!abilityBehavior.WouldDestroyMultiplePartsOnOneCircle) { hittedCircle.Add(col.transform.parent.gameObject); } //get item if exist GameItem item = col.transform.parent.parent.GetComponentInChildren <GameItem>(); UseItem(item); if (col.transform.parent.gameObject != startObject) { Monster monster = col.transform.parent.parent.GetComponentInChildren <Monster>(); if (monster && monster.gameObject.activeSelf) { monster.GetDamage(1); } } } else { //hit on wholeCircle //CSUtil.ERROR("item is not color changer and does not have colorManager on it"); } }