Saludos amigos.
En este articulo os traigo un script para ocultar objetos que se interponen en la visión de nuestra cámara.
El planteamiento es sencillo, se trata de lanzar un rayo desde nuestra cámara hacia delante y si detecta
alguna colisión, realiza una copia del material del objeto.
Crea un nuevo material transparente y le asigna las mismas propiedades del material del objeto detectado.
Le da al objeto este nuevo material y disminuye gradualmente el alfa hasta un valor introducido por nosotros
en la variable "minAlfa".
Si el rayo de nuestra cámara deja de colisionar, restaura el material original y resetea la variables del script.
Espero que os sea útil, creáis un nuevo script, pegáis el código y lo metéis en vuestra cámara.
Le metí un filtrado por Tag para excluir objetos que no nos interese que se oculten y una distancia
a la que queramos que se active.
Enjoy!!
#pragma strict
var bol : boolean = false;
var tiempo : float = 60;
var maxAlfa : float = 1;
var minAlfa : float = 0.2;
var alfa : float;
var excepciones : String[] = ["Player"];
function Start () {
alfa = maxAlfa;
mat = new Material(Shader.Find("Transparent/Diffuse"));
puede = true;
}
function Update () {
Limites ();
Rayo ();
if(bol){
ActivaAlfa ();
}
mat.color.a = alfa;
}
var ob : Collider;
var objeto : Transform;
var matTemp : Material;
var mat : Material;
var guardado : boolean = false;
var copiado : boolean = false;
var nombre : String;
var distancia : float;
var distanciaActivacion : float = 2;
function Rayo () {
var ray = new Ray (transform.position, transform.forward);
var hit : RaycastHit = new RaycastHit();
if (Physics.Raycast (ray.origin, ray.direction, hit, 100)){
ob = hit.collider;
distancia = hit.distance;
if(distancia<=distanciaActivacion){
Excepciones (ob);
if(ob != null && objeto != null && objeto != ob.transform.root){
objeto.renderer.material = matTemp;
}
if(!puede){
Reset ();
}
if(ob && puede){
if(!guardado){
matTemp = ob.renderer.material;
guardado = true;
}
if(!copiado){
mat.CopyPropertiesFromMaterial(matTemp);
mat.shader = Shader.Find("Transparent/Diffuse");
ob.renderer.material = mat;
copiado = true;
nombre = ob.transform.root.name;
objeto = ob.transform.root;
}
bol = true;
}
}
if(distancia >= distanciaActivacion){
Reset ();
}
}else{
if(ob){
Reset ();
}
}
}
function ActivaAlfa () {
if(alfa >= minAlfa){
alfa -= 0.1 * (tiempo/10) * Time.deltaTime;
}
}
function Limites () {
if(alfa > 1){
alfa = 1;
}
if(alfa < 0){
alfa = 0;
}
if(maxAlfa > 1){
maxAlfa = 1;
}
if(maxAlfa < 0){
maxAlfa = 0;
}
if(minAlfa > 1){
minAlfa = 1;
}
if(minAlfa < 0){
minAlfa = 0;
}
}
var puede : boolean = true;
function Excepciones (ob : Collider) {
for(var i:int;i < excepciones.Length;i++){
if(ob.CompareTag(excepciones[i])){
puede = false;
}
}
}
function Reset () {
if(nombre == ob.transform.root.name && puede){
ob.renderer.material = matTemp;
}
bol = false;
ob = null;
guardado = false;
copiado = false;
puede = true;
alfa = 1;
nombre = null;
}
No hay comentarios:
Publicar un comentario