示例#1
0
 private void Trigger(ExplosionInstance explosionInstance)
 {
     if (mCanBeTriggeredByExplosion)
     {
         Ignite();
     }
 }
示例#2
0
 public void Explode(ExplosionInstance explosionInstance)
 {
     foreach (Chunk chunk in Chunks)
     {
         chunk.Explode(explosionInstance);
     }
 }
 private void OnTriggered(ExplosionInstance explosionInstance)
 {
     if (!explosionInstance.ExplosionData.Friendly && Owner.OverrideController.IsOverrideEnabled(Owner.OverrideController.CurrentOverrides.CanBeHurt))
     {
         mHealth -= explosionInstance.ExplosionData.Damage;
         if (mHealth <= 0.0f)
         {
             OnKilled?.Invoke(Owner);
             Destroy(gameObject);
         }
     }
 }
示例#4
0
    public void Explode(ExplosionInstance explosionInstance)
    {
        bool dirty = false;

        for (int y = 0; y < mChunkSettings.NumberOfRows; ++y)
        {
            for (int x = 0; x < mChunkSettings.NumberOfColumns; ++x)
            {
                for (int z = 0; z < mChunkSettings.NumberOfLayers; ++z)
                {
                    int  tileId           = GetTileId(x, y, z);
                    bool isIndistructible = mChunkSettings.TileData[tileId].IsIndestructible;
                    if (isIndistructible)
                    {
                        continue;
                    }

                    Vector3 tilePosition = GetTileWorldPosition(x, y, z);
                    float   distance     = Vector3.Distance(tilePosition, explosionInstance.Position);

                    if (distance <= explosionInstance.ExplosionData.Radius)
                    {
                        int index = x + y * mChunkSettings.NumberOfColumns + z * mChunkSettings.NumberOfColumns * mChunkSettings.NumberOfRows;
                        mTileHealths[index] -= explosionInstance.ExplosionData.Damage;
                        if (mTileHealths[index] <= 0)
                        {
                            OnTileDestroyed(tilePosition, tileId, mTileDepth[index], mTileVariant[index], explosionInstance);
                            SetTile(x, y, z, 0);
                            dirty = true;
                        }
                    }
                }
            }
        }

        if (dirty)
        {
            Sanitize();
            ResetData();
            CalculateTileDepth();
            GenerateMeshData();
            GenerateColliderData();
            Build();
        }
    }
示例#5
0
 public void Explode(ExplosionInstance explosionInstance)
 {
     mChunkControllerInstance.Explode(explosionInstance);
     Collider[] colliders = Physics.OverlapSphere(explosionInstance.Position, explosionInstance.ExplosionData.Radius);
     foreach (Collider collider in colliders)
     {
         Triggerable triggerable = collider.gameObject.GetComponent <Triggerable>();
         if (triggerable != null)
         {
             triggerable.Trigger(explosionInstance);
             if (triggerable.HasPhysics == true)
             {
                 Vector3 delta    = collider.transform.position - explosionInstance.Position;
                 float   distance = delta.magnitude;
                 if (distance <= explosionInstance.ExplosionData.Radius)
                 {
                     triggerable.ApplyConstantVelocityOverTime(explosionInstance.ExplosionData.Knockback, delta.normalized, 0.5f);
                 }
             }
         }
     }
 }
示例#6
0
 public void Trigger(ExplosionInstance explosionInstance)
 {
     OnTriggered?.Invoke(explosionInstance);
 }
示例#7
0
    private void OnTileDestroyed(Vector3 tilePosition, int tileId, int depth, int variant, ExplosionInstance explosionInstance)
    {
        const int SPLITS = 2;

        for (int x = 0; x < SPLITS; ++x)
        {
            float positionX = tilePosition.x - (SPLITS == 1 ? 0 : (mChunkSettings.TileSize / (SPLITS * 2) - x * mChunkSettings.TileSize / SPLITS));
            for (int y = 0; y < SPLITS; ++y)
            {
                float positionY = tilePosition.y - (SPLITS == 1 ? 0 : (mChunkSettings.TileSize / (SPLITS * 2) - y * mChunkSettings.TileSize / SPLITS));
                for (int z = 0; z < SPLITS; ++z)
                {
                    float positionZ = tilePosition.z - (SPLITS == 1 ? 0 : (mChunkSettings.TileSize / (SPLITS * 2) - z * mChunkSettings.TileSize / SPLITS));

                    Vector3 spawnPosition = new Vector3(positionX, positionY, positionZ);

                    GameObject debrisObject = Instantiate(mDebrisPrefab);
                    debrisObject.transform.position   = spawnPosition;
                    debrisObject.transform.localScale = Vector3.one * mChunkSettings.TileSize / SPLITS;

                    MeshRenderer debrisMeshRenderer = debrisObject.GetComponent <MeshRenderer>();
                    debrisMeshRenderer.material       = mChunkSettings.GetMaterial(tileId, depth, variant);
                    debrisMeshRenderer.material.color = mChunkSettings.TileData[tileId].TileColor;

                    Rigidbody debrisRigidbody        = debrisObject.GetComponent <Rigidbody>();
                    Vector3   alignedExplosionSource = new Vector3(explosionInstance.Position.x, explosionInstance.Position.y, spawnPosition.z);
                    Vector3   delta    = spawnPosition - alignedExplosionSource;
                    float     distance = delta.magnitude;
                    float     falloff  = 1.0f - (distance / explosionInstance.ExplosionData.Radius);
                    float     force    = 10.0f * falloff * Random.Range(0.25f, 1.0f);
                    float     forceZ   = Random.Range(force / 2, -force / 2);
                    debrisRigidbody.velocity        += delta.normalized * force + Vector3.up * force + Vector3.forward * forceZ;
                    debrisRigidbody.angularVelocity += Random.onUnitSphere * force;

                    Destroy(debrisObject, 3.0f);
                }
            }
        }
    }