21/09/10 How to Change Skybox through Code in Unity3D
How to Change Skybox through Code in Unity3D
In this video you will learn how you can change the Skybox material with the help of C# script. Download Script : https://drive.google.com/open?id=0B__1zp7jwQOKeWE0Z3NxUURGdzg Download SkyBox : https://www.assetstore.unity3d.com/en/#!/content/60004
youtu.be
Changing skybox material through script -unity Tutorial
Changing skybox material through script -unity Tutorial
we are going to see how to change by Changing skybox material through script by using button or after game starts
youtu.be
Unity C# skybox cubemap generator (source code)
Unity C# skybox cubemap generator (source code)
Source code: https://github.com/przemyslawzaworski/Unity3D-C-programming/blob/master/cubemap_generator.cs
youtu.be
- References
What the code basically does is:
- Get the panorama texture from www
- For each face, calculates the texture
- Assign the generated texture to the cubemap
- Collect garbage
- Assign the cubemap to the shader
```
using System.Collections;
using UnityEngine;
public class ReplaceCubemap : MonoBehaviour
{
public string url = "your file name";
public int CubemapResolution = 256;
private Texture2D source;
/// <summary>
/// These are the faces of a cube
/// </summary>
private Vector3[][] faces =
{
new Vector3[] {
new Vector3(1.0f, 1.0f, -1.0f),
new Vector3(1.0f, 1.0f, 1.0f),
new Vector3(1.0f, -1.0f, -1.0f),
new Vector3(1.0f, -1.0f, 1.0f)
},
new Vector3[] {
new Vector3(-1.0f, 1.0f, 1.0f),
new Vector3(-1.0f, 1.0f, -1.0f),
new Vector3(-1.0f, -1.0f, 1.0f),
new Vector3(-1.0f, -1.0f, -1.0f)
},
new Vector3[] {
new Vector3(-1.0f, 1.0f, 1.0f),
new Vector3(1.0f, 1.0f, 1.0f),
new Vector3(-1.0f, 1.0f, -1.0f),
new Vector3(1.0f, 1.0f, -1.0f)
},
new Vector3[] {
new Vector3(-1.0f, -1.0f, -1.0f),
new Vector3(1.0f, -1.0f, -1.0f),
new Vector3(-1.0f, -1.0f, 1.0f),
new Vector3(1.0f, -1.0f, 1.0f)
},
new Vector3[] {
new Vector3(-1.0f, 1.0f, -1.0f),
new Vector3(1.0f, 1.0f, -1.0f),
new Vector3(-1.0f, -1.0f, -1.0f),
new Vector3(1.0f, -1.0f, -1.0f)
},
new Vector3[] {
new Vector3(1.0f, 1.0f, 1.0f),
new Vector3(-1.0f, 1.0f, 1.0f),
new Vector3(1.0f, -1.0f, 1.0f),
new Vector3(-1.0f, -1.0f, 1.0f)
}
};
void Update()
{
// When trigger, we start the process
if (Input.GetKeyDown(KeyCode.F))
{
// start Coroutine to handle the WWW asynchronous process
StartCoroutine(setImage());
}
}
IEnumerator setImage()
{
WWW www = new WWW(url);
//Texture myGUITexture = Resources.Load("23") as Texture;
Debug.Log(www.bytesDownloaded);
Debug.Log(www.progress);
Debug.Log(www.texture);
yield return www;
source = new Texture2D(www.texture.width, www.texture.height);
// we put the downloaded image into the new texture
www.LoadImageIntoTexture(source);
// new cubemap
Cubemap c = new Cubemap(CubemapResolution, TextureFormat.RGBA32, false);
Color[] CubeMapColors;
for (int i = 0; i < 6; i++)
{
CubeMapColors = CreateCubemapTexture(CubemapResolution, (CubemapFace)i);
c.SetPixels(CubeMapColors, (CubemapFace)i);
}
// we set the cubemap from the texture pixel by pixel
c.Apply();
//Destroy all unused textures
DestroyImmediate(source);
DestroyImmediate(www.texture);
Texture2D[] texs = FindObjectsOfType<Texture2D>();
for (int i = 0; i < texs.Length; i++)
{
DestroyImmediate(texs[i]);
}
// We change the Cubemap of the Skybox
RenderSettings.skybox.SetTexture("_Tex", c);
}
/// <summary>
/// Generates a Texture that represents the given face for the cubemap.
/// </summary>
/// <param name="resolution">The targetresolution in pixels</param>
/// <param name="face">The target face</param>
/// <returns></returns>
private Color[] CreateCubemapTexture(int resolution, CubemapFace face)
{
Texture2D texture = new Texture2D(resolution, resolution, TextureFormat.RGB24, false);
Vector3 texelX_Step = (faces[(int)face][1] - faces[(int)face][0]) / resolution;
Vector3 texelY_Step = (faces[(int)face][3] - faces[(int)face][2]) / resolution;
float texelSize = 1.0f / resolution;
float texelIndex = 0.0f;
//Create textured face
Color[] cols = new Color[resolution];
for (int y = 0; y < resolution; y++)
{
Vector3 texelX = faces[(int)face][0];
Vector3 texelY = faces[(int)face][2];
for (int x = 0; x < resolution; x++)
{
cols[x] = Project(Vector3.Lerp(texelX, texelY, texelIndex).normalized);
texelX += texelX_Step;
texelY += texelY_Step;
}
texture.SetPixels(0, y, resolution, 1, cols);
texelIndex += texelSize;
}
texture.wrapMode = TextureWrapMode.Clamp;
texture.Apply();
Color[] colors = texture.GetPixels();
DestroyImmediate(texture);
return colors;
}
/// <summary>
/// Projects a directional vector to the texture using spherical mapping
/// </summary>
/// <param name="direction">The direction in which you view</param>
/// <returns></returns>
private Color Project(Vector3 direction)
{
float theta = Mathf.Atan2(direction.z, direction.x) + Mathf.PI / 180.0f;
float phi = Mathf.Acos(direction.y);
int texelX = (int)(((theta / Mathf.PI) * 0.5f + 0.5f) * source.width);
if (texelX < 0) texelX = 0;
if (texelX >= source.width) texelX = source.width - 1;
int texelY = (int)((phi / Mathf.PI) * source.height);
if (texelY < 0) texelY = 0;
if (texelY >= source.height) texelY = source.height - 1;
return source.GetPixel(texelX, source.height - texelY - 1);
}
}
```
- image intensity error change
```
using System.Collections;
using UnityEngine;
public class ReplaceCubemap : MonoBehaviour
{
public string url = "your file name";
public int CubemapResolution = 256;
private Texture2D source;
/// <summary>
/// These are the faces of a cube
/// </summary>
private Vector3[][] faces =
{
new Vector3[] {
new Vector3(1.0f, 1.0f, -1.0f),
new Vector3(1.0f, 1.0f, 1.0f),
new Vector3(1.0f, -1.0f, -1.0f),
new Vector3(1.0f, -1.0f, 1.0f)
},
new Vector3[] {
new Vector3(-1.0f, 1.0f, 1.0f),
new Vector3(-1.0f, 1.0f, -1.0f),
new Vector3(-1.0f, -1.0f, 1.0f),
new Vector3(-1.0f, -1.0f, -1.0f)
},
new Vector3[] {
new Vector3(-1.0f, 1.0f, 1.0f),
new Vector3(1.0f, 1.0f, 1.0f),
new Vector3(-1.0f, 1.0f, -1.0f),
new Vector3(1.0f, 1.0f, -1.0f)
},
new Vector3[] {
new Vector3(-1.0f, -1.0f, -1.0f),
new Vector3(1.0f, -1.0f, -1.0f),
new Vector3(-1.0f, -1.0f, 1.0f),
new Vector3(1.0f, -1.0f, 1.0f)
},
new Vector3[] {
new Vector3(-1.0f, 1.0f, -1.0f),
new Vector3(1.0f, 1.0f, -1.0f),
new Vector3(-1.0f, -1.0f, -1.0f),
new Vector3(1.0f, -1.0f, -1.0f)
},
new Vector3[] {
new Vector3(1.0f, 1.0f, 1.0f),
new Vector3(-1.0f, 1.0f, 1.0f),
new Vector3(1.0f, -1.0f, 1.0f),
new Vector3(-1.0f, -1.0f, 1.0f)
}
};
void Update()
{
// When trigger, we start the process
if (Input.GetKeyDown(KeyCode.F))
{
// start Coroutine to handle the WWW asynchronous process
StartCoroutine(setImage());
}
}
IEnumerator setImage()
{
WWW www = new WWW(url);
//Texture myGUITexture = Resources.Load("23") as Texture;
Debug.Log(www.bytesDownloaded);
Debug.Log(www.progress);
Debug.Log(www.texture);
yield return www;
source = new Texture2D(www.texture.width, www.texture.height);
// we put the downloaded image into the new texture
www.LoadImageIntoTexture(source);
// new cubemap
Cubemap c = new Cubemap(CubemapResolution, DefaultFormat.LDR, TextureCreationFlags.None);
Color[] CubeMapColors;
for (int i = 0; i < 6; i++)
{
CubeMapColors = CreateCubemapTexture(CubemapResolution, (CubemapFace)i);
c.SetPixels(CubeMapColors, (CubemapFace)i);
}
// we set the cubemap from the texture pixel by pixel
c.Apply();
//Destroy all unused textures
DestroyImmediate(source);
DestroyImmediate(www.texture);
Texture2D[] texs = FindObjectsOfType<Texture2D>();
for (int i = 0; i < texs.Length; i++)
{
DestroyImmediate(texs[i]);
}
// We change the Cubemap of the Skybox
RenderSettings.skybox.SetTexture("_Tex", c);
}
/// <summary>
/// Generates a Texture that represents the given face for the cubemap.
/// </summary>
/// <param name="resolution">The targetresolution in pixels</param>
/// <param name="face">The target face</param>
/// <returns></returns>
private Color[] CreateCubemapTexture(int resolution, CubemapFace face)
{
Texture2D texture = new Texture2D(resolution, resolution, TextureFormat.RGB24, false);
Vector3 texelX_Step = (faces[(int)face][1] - faces[(int)face][0]) / resolution;
Vector3 texelY_Step = (faces[(int)face][3] - faces[(int)face][2]) / resolution;
float texelSize = 1.0f / resolution;
float texelIndex = 0.0f;
//Create textured face
Color[] cols = new Color[resolution];
for (int y = 0; y < resolution; y++)
{
Vector3 texelX = faces[(int)face][0];
Vector3 texelY = faces[(int)face][2];
for (int x = 0; x < resolution; x++)
{
cols[x] = Project(Vector3.Lerp(texelX, texelY, texelIndex).normalized);
texelX += texelX_Step;
texelY += texelY_Step;
}
texture.SetPixels(0, y, resolution, 1, cols);
texelIndex += texelSize;
}
texture.wrapMode = TextureWrapMode.Clamp;
texture.Apply();
Color[] colors = texture.GetPixels();
DestroyImmediate(texture);
return colors;
}
/// <summary>
/// Projects a directional vector to the texture using spherical mapping
/// </summary>
/// <param name="direction">The direction in which you view</param>
/// <returns></returns>
private Color Project(Vector3 direction)
{
float theta = Mathf.Atan2(direction.z, direction.x) + Mathf.PI / 180.0f;
float phi = Mathf.Acos(direction.y);
int texelX = (int)(((theta / Mathf.PI) * 0.5f + 0.5f) * source.width);
if (texelX < 0) texelX = 0;
if (texelX >= source.width) texelX = source.width - 1;
int texelY = (int)((phi / Mathf.PI) * source.height);
if (texelY < 0) texelY = 0;
if (texelY >= source.height) texelY = source.height - 1;
return source.GetPixel(texelX, source.height - texelY - 1);
}
}
```
https://stackoverflow.com/questions/45032579/editing-a-cubemap-skybox-from-remote-image
Editing a Cubemap Skybox from remote image
I need to download an image from a server, then transform it in a Cubemap and finally put this CubeMap in my Skybox. I work with C#. I came up with this code : public string url = "image/url.jpg...
stackoverflow.com