コード例 #1
0
    public void Grow(PlantInstance plantInstance, LayerData layerData, TextureData textureData)
    {
        this.plantInstance = plantInstance;
        this.layerData     = layerData;

        plantData       = this.plantInstance.GetPlantData();
        plantLayerIndex = LayerData.MaskToIndex(layerData.plants);
        growDelay       = Random.Range(0f, 0.5f);

        RaycastHit hit;

        if (Physics.Raycast(transform.position, Vector3.down, out hit, Mathf.Infinity, layerData.terrain.value))
        {
            if (textureData.FoliageAllowed(hit.point))
            {
                transform.position = hit.point;
                transform.rotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;

                if (plantData.randomRotation)
                {
                    transform.RotateAround(transform.position, transform.up, Random.Range(0f, 360f));
                }

                gameObject.layer = plantLayerIndex;

                if (plantData.seedPrefab != null)
                {
                    seedVisual = Instantiate(plantData.seedPrefab, transform.position, transform.rotation);
                    seedVisual.transform.parent = transform;
                }

                float scale = plantInstance.GetScale();
                transform.localScale = new Vector3(scale, scale, scale);

                if (!plantData.instantIgnite && !plantData.isCigarette)
                {
                    SetupSaturation();
                }

                state = State.Seed;
            }
            else
            {
                Destroy(gameObject);
            }
        }
        else
        {
            Destroy(gameObject);
        }
    }
コード例 #2
0
    private void SetupSaturation()
    {
        Vector3 origin = transform.position + Vector3.up;

        int iterations = plantData.waterCheckIterations;
        int rays       = plantData.waterCheckRays;

        int waterLayerIndex = LayerData.MaskToIndex(layerData.water);

        float radius    = plantData.waterRadius;
        float increment = radius / iterations;
        float radians   = (360 * Mathf.Deg2Rad) / rays;

        float distance = radius;

        for (int i = 0; i < iterations; i++)
        {
            float offset     = increment + i * increment;
            bool  breakEarly = false;

            for (int j = 0; j < rays; j++)
            {
                float x = Mathf.Cos(j * radians);
                float y = Mathf.Sin(j * radians);

                Vector3 target    = new Vector3(origin.x + x * offset, transform.position.y, origin.z + y * offset);
                Vector3 direction = target - origin;

                float rayDistance = GetRayDistance(origin, direction, waterLayerIndex);
                if (rayDistance < distance)
                {
                    distance   = rayDistance;
                    breakEarly = true;
                }
            }

            if (breakEarly)
            {
                break;
            }
        }

        plantInstance.UpdateSaturation(distance);
    }