[C#] Script - Effet sous l'eau - UnderWater

Cette section est destinée aux scripts partagés par la communauté. Chaque post est destiné à un script. Suivez bien les recommandations.
brunom99
Messages : 200
Inscription : 02 Mai 2015 15:41

[C#] Script - Effet sous l'eau - UnderWater

Message par brunom99 » 22 Mai 2015 14:34

Bonjour à tous

Voila, pour faire un petit effet de brouillard quand on est sous l'eau, j'ai fait ce script quil suffit d'attacher à la camera (en mode FPS).
Il recupere tout les objets ayant pour layer = water, il memorise le frog existant, et il est capable de detecter si vous etes sous l'eau ou non :)

J'avais vu quelques scripts qui utilisaient uniquement le niveau Y de l'eau, hors, si on a envie comme moi de faire un lac en haut du montagne, il faut en + bien faire attention que le personnage soit bien dans la zone de l'eau (x et z) en + du y...

De plus, une fois qu'on est sous l'eau, je retourne le composant water de 180° permettant ainsi de voir les vagues au dessus de ma tete... Utile pour si l'eau est un WaterProDayTime.
L'option est desactivable biensur.

N'hesitez pas si vous avez des commentaires :-)

Code : Tout sélectionner

// Author : asimov99@outlook.com

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

// Attach this script on CAMERA First Person
public class UnderWaterScript : MonoBehaviour {

	public bool showSurfaceWaterInTheWater = true; // Set true if you use WaterProDayTime for example
	public Color colorInTheWater = new Color (0f, 0.4f, 0.7f, 0.6f);
	public float densityInTheWater = 0.04f;

	private GameObject[] tabWater;
	private Transform transform;
	private Camera camera;
	private GameObject oldWaterActive;
	// FOG SAVE
	private bool defaultFog;
	private Color defaultFogColor;
	private float defaultFogDensity;

	void Start () {
		// All layer water (Layer n°4)
		tabWater = FindGameObjectsWithLayer (4);
		// Camera player
		camera = GetComponent<Camera>();		
		// Transform player 
		transform = camera.transform;
	}	
	
	void Update () {
		GameObject waterActive = getWaterByTransformPosition ();
		if (waterActive != null && oldWaterActive == null) {
			// Player go in the water, save FOG
			defaultFog = RenderSettings.fog;
			defaultFogColor = RenderSettings.fogColor;
			defaultFogDensity = RenderSettings.fogDensity;
			// Go to water view
			setFOGSettings(true, colorInTheWater, densityInTheWater);
			if(showSurfaceWaterInTheWater) {
				waterActive.transform.Rotate(180f, 0f, 0f);
			}
			//
			oldWaterActive = waterActive;
		} else if(waterActive == null && oldWaterActive != null) {
			// FOG return to normal view
			setFOGSettings(defaultFog, defaultFogColor, defaultFogDensity);
			if(showSurfaceWaterInTheWater) {
				oldWaterActive.transform.Rotate(-180f, 0f, 0f);
			}
			//
			oldWaterActive = null;
		}
	}

	// Return the GameObject Water if transform is in a layer water
	private GameObject getWaterByTransformPosition() {
		for (int i = 0; i < tabWater.Length; i++) { 
			GameObject water = tabWater[i];
			// Check y level
			if(water.transform.position.y > transform.position.y) {
				// Check x and z position
				Renderer renderer = water.GetComponent<Renderer>();
				if(renderer != null) {
					if(renderer.bounds.Contains(new Vector3(transform.position.x, water.transform.position.y, transform.position.z))) {
						return water;
					}
				}				
			}
		}
		return null;
	}

	// Set FOG settings
	private void setFOGSettings(bool fog, Color color, float density) {
		RenderSettings.fog = fog;
		RenderSettings.fogColor = color;
		RenderSettings.fogDensity = density;
	}

	// Return table with all objects with layer xxx
	private GameObject[] FindGameObjectsWithLayer (int layer) { 
		GameObject[] goArray = FindObjectsOfType (typeof(GameObject)) as GameObject[]; 
		List<GameObject> goList = new List<GameObject> (); 
		for (int i = 0; i < goArray.Length; i++) { 
			if (goArray [i].layer == layer) { 
				goList.Add (goArray [i]); 
			} 
		} 
		if (goList.Count == 0) { 
			return null; 
		} else {
			return goList.ToArray (); 		
		}
	}
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Script - Effet sous l'eau - UnderWater

Message par boubouk50 » 22 Mai 2015 15:31

Sympa le partage. Merci.

Il y a une section spéciale pour les scripts en partage dans le forum (Bibliothèque -> Scripts), tu devrais ce post mettre dans cette catégorie. Ici, c'est la section de correction des scripts.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

brunom99
Messages : 200
Inscription : 02 Mai 2015 15:41

Re: Script - Effet sous l'eau - UnderWater

Message par brunom99 » 22 Mai 2015 15:45

Ah oki, je recreer le post alors :)

Avatar de l’utilisateur
LudlowFx
Messages : 1367
Inscription : 19 Sep 2013 05:50

Re: [C#] Script - Effet sous l'eau - UnderWater

Message par LudlowFx » 22 Mai 2015 16:15

Sujet déplacé, doublon supprimé. Merci de ne pas recréer en double demander un déplacement (ou attendez qu'il le soit).
Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

brunom99
Messages : 200
Inscription : 02 Mai 2015 15:41

Re: [C#] Script - Effet sous l'eau - UnderWater

Message par brunom99 » 22 Mai 2015 16:30

Je me fais engueuler en +, hey ho :)

Avatar de l’utilisateur
Franck
Bricoleur
Bricoleur
Messages : 2884
Inscription : 08 Jan 2011 18:43
Localisation : Tours

Re: [C#] Script - Effet sous l'eau - UnderWater

Message par Franck » 23 Mai 2015 07:25

C cool de partager. :)
Dés fois j'bug, dés fois j'bug pas.

brunom99
Messages : 200
Inscription : 02 Mai 2015 15:41

Re: [C#] Script - Effet sous l'eau - UnderWater

Message par brunom99 » 23 Mai 2015 13:58

:)

Yep alors la c'est un script global pour toutes les eaux du jeu qui se link sur la camera... Un inconvenient : on ne peut pas choisir la couleur de l'eau selon les eaux du jeu...
Je vais en faire un autre qui se linkera uniquement sur chaque water que l'on veut gerer....Les deux valent le coup je pense selon les besoins du jeu.

Avatar de l’utilisateur
Arigasoft
Messages : 27
Inscription : 07 Mai 2015 14:53
Localisation : Toulouse - France
Contact :

Re: [C#] Script - Effet sous l'eau - UnderWater

Message par Arigasoft » 27 Mai 2015 11:14

Script bien utile, et sympa de ta part de le partager :)

Répondre

Revenir vers « Scripts »