コード例 #1
0
        /// <summary>
        /// Checks if the position is below the maximum possible wave height. Can be used as a fast broad-phase check, before actually using the more expensive SampleWaves function
        /// </summary>
        /// <param name="position"></param>
        /// <param name="waterObject"></param>
        /// <returns></returns>
        public static bool CanTouchWater(Vector3 position, WaterObject waterObject)
        {
            if (!waterObject)
            {
                return(false);
            }

            return(position.y < (waterObject.transform.position.y + WaveParameters.GetMaxWaveHeight(waterObject.material)));
        }
コード例 #2
0
 private void Reset()
 {
     //Auto-assign water object if there is only one
     if (waterObject == null && WaterObject.Instances.Count > 0)
     {
         waterObject = WaterObject.Instances[0];
         UnityEditor.EditorUtility.SetDirty(this);
     }
 }
コード例 #3
0
ファイル: WaterGrid.cs プロジェクト: guplem/TS20-Thoughts
        public void Recreate()
        {
            RecreateMesh();

            bool requireRecreate = (m_rowsColumns != rowsColumns) || objects.Count < (rowsColumns * rowsColumns);

            if (requireRecreate)
            {
                m_rowsColumns = rowsColumns;
            }

            //Only destroy/recreate objects if grid subdivision has changed
            if (requireRecreate && objects.Count > 0)
            {
                foreach (WaterObject obj in objects)
                {
                    if (obj)
                    {
                        DestroyImmediate(obj.gameObject);
                    }
                }
                objects.Clear();
            }

            int index = 0;

            for (int x = 0; x < rowsColumns; x++)
            {
                for (int z = 0; z < rowsColumns; z++)
                {
                    if (requireRecreate)
                    {
                        m_waterObject = WaterObject.New(material, mesh);
                        objects.Add(m_waterObject);

                        m_waterObject.transform.parent = this.transform;
                        m_waterObject.gameObject.layer = 4;

                        m_waterObject.name = "WaterTile_x" + x + "z" + z;
                    }
                    else
                    {
                        m_waterObject = objects[index];
                        m_waterObject.AssignMesh(mesh);
                        m_waterObject.AssignMaterial(material);
                    }

                    m_waterObject.transform.localPosition = GridLocalCenterPosition(x, z);

                    index++;
                }
            }
        }
コード例 #4
0
ファイル: WaterObject.cs プロジェクト: guplem/TS20-Thoughts
        /// <summary>
        /// Creates a new GameObject with a MeshFilter, MeshRenderer and WaterObject component
        /// </summary>
        /// <param name="waterMaterial">If assigned, this material is automatically added to the MeshRenderer</param>
        /// <returns></returns>
        public static WaterObject New(Material waterMaterial = null, Mesh mesh = null)
        {
            GameObject  go          = new GameObject("Water Object", typeof(MeshFilter), typeof(MeshRenderer), typeof(WaterObject));
            WaterObject waterObject = go.GetComponent <WaterObject>();

            waterObject.meshRenderer = waterObject.gameObject.GetComponent <MeshRenderer>();
            waterObject.meshFilter   = waterObject.gameObject.GetComponent <MeshFilter>();

            waterObject.meshFilter.sharedMesh       = mesh;
            waterObject.meshRenderer.sharedMaterial = waterMaterial;
            waterObject.material = waterMaterial;

            return(waterObject);
        }
コード例 #5
0
        public void FixedUpdate()
        {
            if (!this || !this.enabled || Disable)
            {
                return;
            }

#if UNITY_EDITOR
            if (!EnableInEditor && Application.isPlaying == false)
            {
                return;
            }
#endif

            if (autoFind)
            {
                waterObject = WaterObject.Find(this.transform.position, false);
            }

            if (!waterObject || !waterObject.material)
            {
                return;
            }

            m_waterLevel = waterObject && waterLevelSource == WaterLevelSource.WaterObject? waterObject.transform.position.y : waterLevel;

            normal = Vector3.up;
            height = 0f;
            if (samples.Count == 0)
            {
                height = Buoyancy.SampleWaves(this.transform.position, waterObject.material, m_waterLevel - heightOffset, rollAmount, dynamicMaterial, out normal);
            }
            else
            {
                Vector3 avgNormal = Vector3.zero;
                for (int i = 0; i < samples.Count; i++)
                {
                    height    += Buoyancy.SampleWaves(ConvertToWorldSpace(samples[i]), waterObject.material, m_waterLevel - heightOffset, rollAmount, dynamicMaterial, out normal);
                    avgNormal += normal;
                }

                height /= samples.Count;
                normal  = (avgNormal / samples.Count).normalized;
            }

            ApplyTransform();
        }
コード例 #6
0
 /// <summary>
 /// Given a position in world-space, returns the wave height and normal
 /// </summary>
 /// <param name="position">Sample position in world-space</param>
 /// <param name="waterObject">Water object component, used to get the water material and level (height)</param>
 /// <param name="rollStrength">Multiplier for the the normal strength</param>
 /// <param name="dynamicMaterial">If true, the material's wave parameters will be re-fetched with every function call</param>
 /// <param name="normal">Output upwards normal vector, perpendicular to the wave</param>
 /// <returns>Wave height, in world-space.</returns>
 public static float SampleWaves(UnityEngine.Vector3 position, WaterObject waterObject, float rollStrength, bool dynamicMaterial, out UnityEngine.Vector3 normal)
 {
     return(SampleWaves(position, waterObject.material, waterObject.transform.position.y, rollStrength, dynamicMaterial, out normal));
 }
コード例 #7
0
 /// <summary>
 /// Faux-raycast against the water surface
 /// </summary>
 /// <param name="waterObject">Water object component, used to get the water material and level (height)</param>
 /// <param name="origin">Ray origin</param>
 /// <param name="direction">Ray direction</param>
 /// <param name="dynamicMaterial">If true, the material's wave parameters will be re-fetched with every function call</param>
 /// <param name="hit">Reference to a RaycastHit, hit point and normal will be set</param>
 public static void Raycast(WaterObject waterObject, Vector3 origin, Vector3 direction, bool dynamicMaterial, out RaycastHit hit)
 {
     Raycast(waterObject.material, waterObject.transform.position.y, origin, direction, dynamicMaterial, out hit);
 }