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(但我不工作。。。