Unity怎么用代码改变gameobject的tag和贴图

Unity怎么用代码改变gameobject的tag和贴图,第1张

不知道你的col是什么类型,如果是GameObject类型的,试试这样写

if (coltag == "UnitCube1")

{

coltag = "UnitCube";

colrenderermaterialmainTexture = textures;

}

用DebugLog或者print,看一下你if里面的代码是否执行了。如果没执行就要找一下错误了。

Unity3D中gameObject和GameObject的区别

这两个相比,gameObject好理解一点,就是你脚本挂着的那个物体。这个实例化过程是Unity帮你实现的,不用在写代码实例化。thisgameObject默认函数,脚本一创建直接就get到了。

例如,有一个A物体。你给它挂载一个脚本里写thisgameObject。那就等于是直接获取(实例化)A这个物体了,你直接可以引用它下面挂载的属性。

GameObject不是对象,通常需要获取一个对象,就像你定义一个public GameObject A;

那么属性里就会出现一个可托选的框,那就是Unity告诉你,你定义的这个物体是哪个物体要你选择,无论你拖拽也好,脚本里获取也好,都是要给A赋予对象的。

中国AR网(>

常用核心类:  MonoBehaviour  ,  Application、Transform  ,GameObject

MonoBehaviour  类

       本类是所有脚本和类(内置类与自定义类)的基础类。 这个类主要提供了各种事件函数的静态方法。例如前面提到的  Awake  、Start,Update  等函数(方法),可重写函数都是由本类提供。

本类还包含重要的回调函数例如Invoke()、InvokeRepeating()函数(功能: 以某个自定义的函数名为参数并在特定的时机调用该自定义函数)。本类还提供关于触发器的函数:例如:  

OnTriggerEnter()  函数

OnTriggerExit()   函数

OnTriggerStay()

函数应用程序是一项非常重要的属性,所有应用程序相关的方法都写在Application类中。访问应用程序的运行时数据,

以获取或设置当前应用程序的一些属性,比如加载游戏关卡,获取资源文件路径,退出当前游戏程序,获取当前游戏平台等。

Transform——场景中的每一个物体都有一个Transform。用于储存并 *** 控物体的位置、旋转和缩放。每一个Transform可以有一个父级,允许

你分层次应用位置、旋转和缩放。可以在Hierarchy面板查看层次关系。 定义了对象的位置、旋转、缩放属性的类。由于该类继承了

Component 类,所以也是一种组件。也就是说任何一个游戏对象都由于Transform 组件。

例如:

//设置游戏对象的位置

transformposition=new Vector3(0,0,0);

//绕X轴旋转30度

transformeulerAngles=new Vector3(30,0,0);

//

设置游戏对象缩放到3倍

transformlocalScale  =new  Vector3(3,3,3);

前面我们已经学习了关于transform的一些属性,下面来学习一些关于transform的方法。通过代码来控制transform的变换。

void Update ()

{

transformTranslate(new Vector3(0,0,1),SpaceWorld);

}

以上两句话分别尝试让transform毎帧都进行移动。

游戏对象是所有其他组件的容器。它还拥有Tag(标签),Layer(层)和Name(名称)属性。 场景中所有的游戏对象都是通过实例化该类来

生成的。  当把一个资源放入场景中后,Unity3D 就会(自动)通过GameObject  类来生成对应的游戏对象。

MonoBehaviour  :  Behaviour  :  Component  :Object

GameObejct:  Objecto

教程由中国AR网资源教程(>

很早就看到有这个东西了,但是一直没有去好好看,一看不知道,看了就爱上他了,真的是一个好用的东西。

用来存储数据的一个 资源文件 ,像是JSON、XML、文本文件这样的存储文件,可以用来存储数据。但是这里他在最开始的时候不需要再次读文件,就像是JSON在游戏开始时,我们需要加载JSON文件中的数据,我们就需要读取这个文件,然后在赋值给对象。他就可以直接使用其中的数据。因为他是资源文件,所以他有着资源文件的特性,我们ResourceLoad他就可以使用他了。

其实可以简单的理解为把你所有的数据都用变量在一个类中声明,然后我们使用的时候,直接实例化这个类就好了。

●他可以作为一个引用在脚本上,因为他是资源文件。

●不会被unity序列化机制影响,所以可以多场景共有。( 序列化文章 )

●在实例化对象时用它来做配置文件降低了内存的消耗

●有自己的回调OnEnable、OnDisable、OnDestroy。

用简单的例子来看看怎么用。

数据体类:

创建:

使用:

当然你也可以用菜单创建这个,如下:

今天就简单说说这个吧,其实他的用处和好处不仅仅是这么一点点,还有很多很多,今天就不一一说到了。

突然觉得这篇写的好水,虽然一直都好水。哈哈,见谅见谅。

脚本文件名称一定要与继承ScriptableObject的类名一样。不然会出现脚本为空的情况。

这样会导致你现在序列化存储的数据在,等你修改了场景或者打包的时候数据就不会存在了。就会出现下面这种情况。

如果你这个时候再次指定脚本为None,这个问题就解决了。但还是会想上一张图那样,但是数据就是一直序列化了,修改场景然后保存都不会出现第二张图的情况。

但是严谨的思维,还是把脚本文件名称一定要与继承ScriptableObject的类名弄成一样。这样的话那个script上就不是None,出错的概率会少一些。

public GameManager gameManager 你这里只是声明了gameManager,并没有给它实例化 如果你gameManager是某个对象上的脚本,你可以先Find这个游戏对象 然后用gameManager=gameObjectGetComponent()来获取

如果其中一个或多个UnityEngineObjects包含对UnityEngineObject另一个捆绑包中的引用,可以说AssetBundle依赖于其他AssetBundle ;相反,则没有依赖关系。

在引用过程中,Bundle2会将依赖于Bundle1的对象的副本复制到Bundle1里。如果Bundle1包含依赖项,那么在实例化的对象家在之前,需要先加载包含那些依赖项的Bundle。

举例:Bundle1中的模型A需要引用Bundle2中的材质B,那么在加载模型A之前,需要先加载Bundle2。也就是说,先加载Bundle1,再加载Bundle2,然后加载材质B,最后加载模型A。实例化对象:

Unity技术支持团队经常会对有需求的客户公司项目进行游戏项目性能审查与优化,在我们碰到过的各种项目相关的问题中也有很多比较共同的方面,这里我们罗列了一些常见的问题并进行了归类,开发者朋友们可以参考下。

(1)资源导入

1纹理没有压缩

在很多情况下,美术会觉得纹理压缩后效果不理想。我们建议的是: 可以把原图的分辨率长宽都扩大一倍,保持原有压缩格式。这样压缩过后的文件还是比不压缩的文件要小,并且视觉效果可以得到较大的改善。

2纹理导入设置中的 Read/Write Enabled 处于勾选状态

开启纹理导入设置中 Read/Write Enabled,纹理在传到GPU之后,CPU端的数据也会一直保留在内存中。因为在移动端显存共享内存,会导致内存占用加倍。 因此需要注意是否有需要在CPU端访问的纹理 ,比如:需要通过脚本获取纹理像素的情况下,就要开启纹理导入设置中的 Read/Write Enabled。

3模型文件导入设置中 Read/Write Enabled 处于勾选状态

除了需要脚本中访问的网格,作为网格碰撞器中的网格,脚本中用StaticBatchingUtilityCombine静态合批的网格,以及粒子系统发射的网格之外,其它模型建议不要勾选此项, 否则会在内存也保留一份网格实例占用内存。

4模型导入设置[Rig]选项页中Optimize GameObject没有勾选

建议开启Optimize GameObject ,这个选项可以把SceneManager中用于skinning的节点都去除,节省了场景节点树更新以及查询的CPU消耗,对于需要做挂点的节点可以添加到例外列表中。

5使用第三方音频插件时没有禁用Unity内置音频

不需要使用Unity内置音频模块的时候,建议Editor中通过勾选Edit->Project Settings->Audio->Disable Unity Audio来完全禁用FMOD模块 ,避免不必要的CPU消耗。

(2)CPU常见性能问题

1频繁调用的Cameramain

建议脚本做好Main Camera的Cache 。Cameramain实际为GameObjectFindGameObjectsWithTag(“MainCamera”)调用,主要因为引擎无法得知用户通过脚本设置的MainCamera,CPU消耗较高。

2脚本中大量UnityEngineObject的判等 *** 作

建议改为用InstanceID来判断 ,即Object GetInstanceID,运行期间保证唯一。 因为Object的判等还有额外的耗时 *** 作,而Int类型的判等就非常快速了。同理,使用Object作为key的数据结构也建议改用InstanceID做key。

3用于查询 *** 作的数据使用list数据结构

List线性结构Contains的耗时非常高,建议改为hashset,hashtable之类的查询 *** 作效率高的数据结构

4加载资源时每帧从Assetbundle加载的Asset数量没有限制

在场景内每帧从Assetbundle加载的Asset数建议限制在2到5个 ,数量高时耗时过长容易造成卡顿。

(3)内存常见问题

1加载场景的时候有 一段内存尖峰

常见的情况是 有无索引的资源被加载进来,然后因为UnloadUnusedAssets被卸载掉 。内存尖峰基本都是对游戏本身无用的内存,但是可能会因此造成游戏在内存紧张的机器上被强制关闭。

2静态索引导致的内存泄漏

一些内存占用较大的资源如纹理, 因为有静态索引而无法在切换场景或者调用UnloadUnusedAssets时被卸载掉,因此内存的泄漏量会随着用户切换场景的次数而增加。

这个值越大说明有越多的不必要内存池扩展 ,比如说在同一帧内有加载大量资源,实例化大量对象等,可能让内存池瞬间膨胀的 *** 作。

4GC分配量较大

项目Review过程中,除了CPU时间占用和内存分配量,我们还会留意脚本函数的GC分配。 GC分配越频繁,量越大,由于Mono内存池可用内存不足导致的GCCollect(造成卡顿原因之一)调用就越频繁,并且可能引起mono内存池不必要的扩展,因此脚本函数的GC分配量是既影响CPU也影响内存的重要参数

对于GC分配量。我们建议的参考数值为

对于基本每帧都会分配GC的函数,GC分配量大于2KB的建议都确认下是否有可能把临时变量抽取出来。对于偶尔分配GC的函数,GC分配量大于10KB的建议都确认下分配的数据结构是否有优化空间。

(4)GPU常见性能问题

1 特效渲染的Pass数量较多

一些特效的渲染可以合并到同一个Pass以节省GPU开销,另外RenderTexture在可以共用的情况下尽量共用

2 同屏面数过多

同屏面数建议在20W以下,较优情况是控制在10W以内

3 UI元素在需要隐藏的时候使用了设置Alpha为0的方式

实际上GPU依然需要对UI mesh进行渲染,建议不要通过设置Alpha为0的方式来隐藏UI。

4 当使用网格作为地形时,适当切分地形网格

在网格顶点数很高情况下需要依靠硬件裁剪来剔除顶点,比较消耗GPU性能,建议按照大概的同屏可见范围来切分地形网格。

5 UI元素过多依赖多层元素的混合来达到美术效果

这样会造成较多的Overdraw,建议尽量通过预制纹理来做到想要的效果。

转自:unity官方中文论坛

public GameObject originObject;//设置好你希望实例化的对象

在合适的地方,比如你的按钮if(GUIButton)下

GameObject obj = (GameObject)Instantiate(originObject,position, rotation);//添加,position和rotation可选

Destroy(obj);//删除

对objtransform做相应的处理就是对应移动和旋转 *** 作

以上就是关于Unity怎么用代码改变gameobject的tag和贴图全部的内容,包括:Unity怎么用代码改变gameobject的tag和贴图、Unity教程:Unity常用类(五)、【Unity】简单说说ScriptableObject等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9656046.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存