Need help for faking a light for a security camera

Hi there!

I’m having trouble creating a good light effect for my security camera. I tried projectors and spot light options, they are both leaking through walls. I can’t use deffered lights since i’m developping for mobiles so I mainly focused on projector trying to play with far clipping with a raycast but even with this way the result is not really acceptable(light still leaking a bit sometimes and it’s “jumping”). I wanted to try the same idea with many projectors but of course the draw calls increase dramatically then. I’m thinking about create meshes dynamicly but it seems too much difficult for me and I can’t be sure it would fit my need.
And i can’t use layers since i’m already using most of them and that would be a total mess anyway.

So i come here to ask you guys what should I do?

I managed to do an acceptable answer to my issue with mesh creation on run.

screenshot:
[44003-done.jpg*_|44003]

For those who would be interested here is my full code:

using UnityEngine;
using System.Collections;

public class RayCaster : MonoBehaviour 
{
    public float angle = 19;
    public int pointCount = 80;
    public float distance=15;
    public LayerMask mask;
    public int subdivision = 5;
    Transform trans;
    Quaternion initialRotation;
    Vector3 eulerInitialRotation;
    public MeshFilter mf;
    Mesh mesh;   

    void Awake()
    {
        trans=transform;
        mesh=new Mesh();
        mf.mesh=mesh;
    }

    void Start()
    {
        eulerInitialRotation = trans.localEulerAngles;
        StartCoroutine(RayCasting());
    }

    IEnumerator RayCasting()
    {
        RaycastHit hit;
        Vector3[] verts = new Vector3[pointCount*subdivision+1];
        int[] tri = new int[pointCount*(subdivision-1)*6+pointCount*3];
        Vector3[] normals = new Vector3[pointCount*subdivision+1];
        Vector2[] uvs = new Vector2[pointCount*subdivision+1];
        while(true)
        {
            eulerInitialRotation = trans.localEulerAngles;
            float dis;
            int triIt=1;
            int It=1;
            dis=distance;
            Vector3 lastPoint = Vector3.zero;
            if(Physics.Raycast(trans.position, trans.forward, out hit, distance, mask))
            {
                dis=hit.distance;
                mf.transform.position=new Vector3(hit.point.x, 0, hit.point.z);
                verts[0]=hit.point-mf.transform.position-trans.forward*0.05f;;
                normals[0]=hit.normal;
            }
            else
            {
                Vector3 temp = trans.position+trans.forward*dis;
                temp.y=0;
                mf.transform.position=temp;
                verts[0]=(trans.position+trans.forward*dis)-mf.transform.position-trans.forward*0.05f;;
                normals[0]=-trans.forward;
            }
            uvs[0]=new Vector2(0.5f,0.5f);
            Debug.DrawRay(trans.position, trans.forward*distance, Color.green, Time.deltaTime);

            for(int i=0; i<subdivision; i++)
            {
                trans.rotation *= Quaternion.Euler(new Vector3(((float)(subdivision-i)/subdivision)*angle,0,0));
                for(int j=0; j<pointCount; j++)
                {
                    dis=distance;
                    if(Physics.Raycast(trans.position, trans.forward, out hit, distance, mask))
                    {
                        dis=hit.distance;
                        verts[It]=hit.point-mf.transform.position-trans.forward*0.1f;
                        normals[It]=hit.normal;
                       
                    }
                    else
                    {
                        verts[It]=(trans.position+trans.forward*dis)-mf.transform.position;
                        verts[It]=new Vector3(verts[It].x, 0 ,verts[It].z);
                        normals[It]=Vector3.up;
                    }
                    It++;
                    trans.localEulerAngles = new Vector3(eulerInitialRotation.x, eulerInitialRotation.y, eulerInitialRotation.z+(360f/pointCount)*j);
                    trans.rotation *= Quaternion.Euler(new Vector3(((float)(subdivision-i)/subdivision)*angle,0,0));
                    //Debug.DrawRay(trans.position, trans.forward*dis, Color.red, Time.deltaTime);
                }
                trans.localEulerAngles = eulerInitialRotation;
            }
            for(int i=0; i<pointCount*(subdivision-1)*6;i=i+6)
            {
                tri*=triIt;*

if((float)(triIt)%(pointCount)==0)
{
tri[i+1]=triIt+1;
tri[i+2]=triIt+1-pointCount;
tri[i+3]=triIt;
tri[i+4]=triIt+pointCount;
tri[i+5]=triIt+1;
}
else
{
tri[i+1]=triIt+pointCount+1;
tri[i+2]=triIt+1;
tri[i+3]=triIt;
tri[i+4]=triIt+pointCount;
tri[i+5]=triIt+pointCount+1;
}
triIt++;
}
for(int i=pointCount*(subdivision-1)6; i<pointCount(subdivision-1)6+pointCount3; i=i+3)
{
tri*=triIt;*
tri[i+1]=0;
if(triIt==pointCount*subdivision)
tri[i+2]=triIt+1-pointCount;
else
tri[i+2]=triIt+1;
triIt++;
}
mesh.vertices=verts;
mesh.triangles=tri;
mesh.normals=normals;
mesh.uv=uvs;
yield return null;
}
}
}
Use this with the projector/light shader with a white texture for cookie and black for falloff to boost the light.
This is not perfect but it quite answered my need.
I still have to test more for the performance…
If someone have an idea to improve this i’ll be glad :stuck_out_tongue:
_*