C# 通过脚本c更改纹理#

C# 通过脚本c更改纹理#,c#,unity3d,textures,C#,Unity3d,Textures,我无法将纹理切换到网格,当我接近网格时,新纹理应出现: string name = picture.name; Texture2D tex = (Texture2D)Resources.Load(name, typeof(Texture2D)); picture.GetComponent<Renderer>().material.mainTexture = tex; string name=picture.name; texture2dtex=(Texture2D)Resource

我无法将纹理切换到网格,当我接近网格时,新纹理应出现:

string name = picture.name;
Texture2D tex = (Texture2D)Resources.Load(name, typeof(Texture2D));
picture.GetComponent<Renderer>().material.mainTexture = tex;
string name=picture.name;
texture2dtex=(Texture2D)Resources.Load(名称,typeof(Texture2D));
picture.GetComponent().material.mainTexture=tex;
我想做的是在我走远的时候恢复旧的纹理,但我无法以任何方式做到这一点。。。 我相信问题在于

Texture old = picture.GetComponent<Renderer>().material.GetTexture ("_MainTex");
Texture old=picture.GetComponent().material.GetTexture(“_MainTex”);
每次都获取图片的名称,即使它已更改,因此将保存当前纹理名称,而我无法恢复原始纹理名称

PS:我的纹理是动态的,我不能在inspector中设置它们

using UnityEngine;
using System.Collections;

public class pictures : MonoBehaviour {
    public GameObject[] pictures;
    public GameObject player;

    void Start() {
        player = GameObject.FindGameObjectWithTag("Player");
        pictures = GameObject.FindGameObjectsWithTag("pictures");
    }

    void MyFunction(GameObject picture, string name) {
        Texture2D tex = (Texture2D)Resources.Load(name, typeof(Texture2D));
        picture.GetComponent<Renderer>().material.mainTexture = tex;
        Debug.Log("change the texture " + name);
    }

    void Update() {
        foreach (GameObject picture in pictures) {
            if (Vector3.Distance(picture.transform.position, player.transform.position) < 20) {
                MyFunction(picture, picture.name);
            } else {
                Texture old = picture.GetComponent<Renderer>().material.GetTexture("_MainTex");
                Debug.Log(old.name);
                MyFunction(picture, old.name);
            }
        }
    }
}
使用UnityEngine;
使用系统集合;
公共课图片:单行为{
公共游戏对象[]图片;
公共游戏对象玩家;
void Start(){
player=GameObject.FindGameObjectWithTag(“player”);
pictures=GameObject.FindGameObjectsWithTag(“图片”);
}
void MyFunction(游戏对象图片、字符串名称){
texture2dtex=(Texture2D)Resources.Load(名称,typeof(Texture2D));
picture.GetComponent().material.mainTexture=tex;
Log(“更改纹理”+名称);
}
无效更新(){
foreach(图片中的游戏对象图片){
if(矢量3.距离(picture.transform.position,player.transform.position)<20){
MyFunction(picture,picture.name);
}否则{
纹理old=picture.GetComponent().material.GetTexture(“_MainTex”);
Debug.Log(旧的.name);
MyFunction(图片,旧的.name);
}
}
}
}

MyFunction2
从不更改纹理或名称。你从哪里得到另一种纹理?我真的不明白

这个怎么样:

using UnityEngine;
using System.Collections;

public class Vetrine : MonoBehaviour
{
    public Texture2D textn;
    public GameObject[] pictures;
    public GameObject player;

    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        marker = GameObject.FindGameObjectsWithTag("infowindow");
        pictures = GameObject.FindGameObjectsWithTag("picture");
    }

    void MyFunction(GameObject picture, string name)
    {
        Texture2D tex = (Texture2D)Resources.Load(name, typeof(Texture2D));
        picture.renderer.material.mainTexture = tex;
    }

    void Update()
    {
        foreach (GameObject picture in pictures)
        {
            if (Vector3.Distance(picture.transform.position, player.transform.position) < 20)
            {
                MyFunction(picture, picture.name);
            }
            else
            {
                MyFunction(picture, "someOtherNameHere");
            }
        }
    }
}
使用UnityEngine;
使用系统集合;
公营兽医:单一行为
{
公共纹理2d textn;
公共游戏对象[]图片;
公共游戏对象玩家;
void Start()
{
player=GameObject.FindGameObjectWithTag(“player”);
marker=GameObject.FindGameObjectsWithTag(“信息窗口”);
pictures=GameObject.FindGameObjectsWithTag(“图片”);
}
void MyFunction(游戏对象图片、字符串名称)
{
texture2dtex=(Texture2D)Resources.Load(名称,typeof(Texture2D));
picture.renderer.material.mainTexture=tex;
}
无效更新()
{
foreach(图片中的游戏对象图片)
{
if(矢量3.距离(picture.transform.position,player.transform.position)<20)
{
MyFunction(picture,picture.name);
}
其他的
{
MyFunction(图片“someOtherNameHere”);
}
}
}
}

请注意,
pictures
得到的是
FindGameObjectsWithTag
的结果,因为它以前是空的。

好的,我自己解决了它,我创建了一个数组oldnames,并在函数Start中用纹理的旧名称填充它,然后在更新中,如果距离较大,则函数称为whit array index of oldnames,它与纹理obiouvsly相同,因为数组图片中的所有纹理都有一个名称:)

PS:所有纹理必须在资源文件夹中

现在是时候检查它是否需要太多的资源,以及选择一种触发方式是否更好

我希望能帮助别人解决这个问题

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

public class pictures : MonoBehaviour {

    public GameObject[] pictures;   
    public GameObject player;

    List<string> oldnames = new List<string>();
    public Texture  old;
    public string oldName;

    // Use this for initialization
    void Start () {

        player = GameObject.FindGameObjectWithTag("Player");    
        pictures = GameObject.FindGameObjectsWithTag( "pictures" );

        foreach(GameObject picture in pictures)
        {
            old = picture.renderer.material.GetTexture ("_MainTex");
            oldName = old.name;
            oldnames.Add(oldName);
        }
    }

    void MyFunction(GameObject picture, string name) {

        Texture2D tex = (Texture2D) Resources.Load(name, typeof(Texture2D));
        picture.renderer.material.mainTexture = tex;
    }

    // Update is called once per frame
    void Update () {

        for(int i = 0; i < pictures.Length; i++)
        { 
            GameObject picture = vetrine[i];            

            if (Vector3.Distance(picture.transform.position, player.transform.position) < 10)
            {
                MyFunction(picture, picture.name);
            } 
            else 
            { 
                MyFunction(picture, oldnames[i]);
            }
        }
    }       
}
使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
公共课图片:单行为{
公共游戏对象[]图片;
公共游戏对象玩家;
列表旧名称=新列表();
公共结构陈旧;
公共字符串oldName;
//用于初始化
无效开始(){
player=GameObject.FindGameObjectWithTag(“player”);
pictures=GameObject.FindGameObjectsWithTag(“图片”);
foreach(图片中的游戏对象图片)
{
old=picture.renderer.material.GetTexture(“_MainTex”);
oldName=old.name;
oldName.Add(oldName);
}
}
void MyFunction(游戏对象图片、字符串名称){
texture2dtex=(Texture2D)Resources.Load(名称,typeof(Texture2D));
picture.renderer.material.mainTexture=tex;
}
//每帧调用一次更新
无效更新(){
对于(int i=0;i

注意:
.renderer
已折旧(请改用
.GetComponent()

代码在哪里?启动功能?更新函数?我试着加入更新,也加入了我的自定义函数,但仍然无法粘贴完整的代码,以便我可以查看它=)好的,我编辑了第一个帖子,我试图从检查器获取旧纹理:public Texture2D oldTexture;在myfunction2中:picture.renderer.material.mainTexture=oldTexture;我没有通过myfunction2内容,因为我正在编写它,当您编写MyFunction(图片,“someOtherNameHere”)时,我更改了它;我应该在运行时从模型中获取这些图片(它们是旧的,明白吗?),但因为我无法做到这一点,我尝试在pinspector中设置这些图片,但没有成功…好的,那么用用于获取旧图片名称的代码替换“someOtherNameHere”…可能问题在于,我使用了picture.renderer.material.GetTexture(但我不工作。。。