示例#1
0
    IEnumerator _Hit(CellHitInfo info)
    {
        yield return(new WaitForSeconds(0.05f));

        ChangeMaterial();
        GotHit(info);

        if (info.fatal)
        {
            if (finalBigCell && PongPadBuilder.instance.IsFinalLevel)
            {
                const int STEPS = 24;
                Vector3   point = Vector3.Lerp(info.hit_point, transform.position, 0.5f);
                for (int i = 0; i < STEPS; i++)
                {
                    Vector3 normal = Quaternion.Euler(0, 360 * i / (float)STEPS, 0) * Vector3.forward;
                    EmitHitPS(point, normal, Color.white, velocity_mul: 1.7f);
                }
            }

            Destroy((GameObject)gameObject);
            if (bonus)
            {
                Bonus.AddBonus(transform.position);
            }

            float cell_fraction = GetCellFraction();
            int   points1       = Mathf.RoundToInt(points * cell_fraction);
            Points.AddPoints(transform.position, MyMaterial.color, points1, pointsSize);
            PongPadBuilder.instance.KilledOneCell(cell_fraction);
        }
    }
示例#2
0
    protected override void GotHit(CellHitInfo info)
    {
        if (info.fatal)
        {
            dying_cell_time     = Time.time;
            dying_cell_location = transform.position;
        }
        else if (spawnCellPrefabs.Length > 0)
        {
            int spawn_count = spawnCellOrientation.Length;
            Debug.Assert(spawn_count > 0);
            Debug.Assert(finalBigCell);

            StartCoroutine(PassThroughCocoonMode(spawnCellPrefabs.Length == 1 ? 2.2f : 11f));

            void SpawnNewCell(LivingCell prefab, Quaternion orientation)
            {
                var spawn = Instantiate(prefab, transform.parent);
                var q     = Quaternion.LookRotation(info.hit_point - transform.position);

                q = q * orientation;
                float dist = 0.055f + 0.21f - spawn.transform.localScale.y;
                var   p    = transform.position + dist * (q * Vector3.forward);

                spawn.transform.SetPositionAndRotation(p, q);
                spawn.fraction_of_original = 1f / (full_energy * spawn_count + 1);
                spawn.points = Mathf.RoundToInt(spawn.points / spawn.fraction_of_original);
            }

            for (int i = Mathf.RoundToInt(energy); i < Mathf.RoundToInt(info.prev_energy); i++)
            {
                int j = i % spawnCellPrefabs.Length;
                j = spawnCellPrefabs.Length - 1 - j;
                var prefab = spawnCellPrefabs[j];
                foreach (var orientation in spawnCellOrientation)
                {
                    SpawnNewCell(prefab, Quaternion.LookRotation(orientation));
                }
            }
        }
        else if (last_moving_target != null && energy >= 1e-3f)
        {
            var copy = Instantiate(this, transform.parent);
            copy.copied_from_cell = this;

            Debug.Assert(copy.energy > 0f);
        }
    }
示例#3
0
 protected virtual void GotHit(CellHitInfo info)
 {
 }