Unity2017.3.1f1 API过时,求问如何修改

Unity2017.3.1f1 API过时,求问如何修改,第1张

修改Emission:之前使用直接修改ParticleSystem的emissionRate属性,现在要通过修改ParticleSystememissionrateOverTimeMultiplier(我这里修改的是RateOverTime 并且是Constant形式)。直接对其赋值,发现会报错 Cannot modify a value type returnvalue of `UnityEngineParticleSystememission’ Consider storing the value in atemporary variable之后根据提示发现需要使用反射,具体我的代码如下:

//part代表要修改射速相关属性的ParticleSystem对象

SystemType type = partemissionGetType();

PropertyInfo property = typeGetProperty(“rateOverTImemultiplie”);

float f = partemissionrateOverTimeMultiplier;

f += 10;

propertySetValue(partemission,f,null

1

2

3

4

5

6

动态修改粒子发射颜色

修改StartColor:之前使用直接修改ParticleSystem对象的startColor属性(这里修改的是Alpha值),如下:

Color adjustColor = partstartColor;

adjustColora += 001f;

partstartColor = adjustColor;

1

2

3

注意:上面使用了一个中间变量来对alpha值进行增加之后,再将颜色赋给startColor,直接使用partstartColora+=001f是不行的,会有错误提示 Cannot modify a value type returnvalue of `UnityEngineParticleSystememission’ Consider storing the value in atemporary variable。

可以勾选多个,首先,新建一个场景,如果有自己的天空盒资源的话,在Window->Lighting下设置下天空(默认天空盒也不影响演示)

新建一个空对象命名为Star, 为其添加Particle System组件。Tips:一个对象最多只能有一个Particle System组件。

勾选Prewarm 字面意思就是预热。就是场景一开始,就已经有很多粒子(粒子产生和消失已经平衡)如果不勾选,一开始什么都没有,等一会粒子数才变多。

设置Start Lifetime(粒子的寿命(开始时)) 由于星星一般移动比较慢,例子寿命(秒数)设置的长一点。

Emission模块保持勾选,无需改动保持默认即可。如果希望加快星星的产生,可以增大Rate over Time选项。

在Shape下,我们修改的是粒子生成装置的形状。我们改成一个Box(我们希望星星是从一个大盒子里生成的)

设置盒子的大小 BoxX/Y/Z设置为100 同时Emit from设置为Volume, 意思是从整个体积均匀生成。(也可以设置成从盒子底部生成)

展开Renderer, 为Material属性赋值,设置粒子的样子(材质)。 使用自带的Default-Particle就可以。最终效果。

通过GameObjectFind("节点的名字"), 来寻找到其他节点的object;

不管是父节点,子节点 都可以直接找到。

//题外话

GameObjectFind() 消耗大,别用到Update();

如果这个节点的active 是false 用GameObjectFind()是找不到的。

(active 为false 就是Tag 位置上边的勾选框 没有勾选)

这就是为什么会建立一个空节点作为父节点,然后在空节点下面放其他有用的节点吧。。。?

让这个空节点active 保持是 true;

然后通过

GameObjectFind("空节点的名字")transformFind("active是false的子节点");

在不同的平台上该路径是不同的:在编辑器模式下是Assets目录,即:<path to projectfolder>/Assets

string path:即游戏数据所在目录

string searchPattern:因要找的是prefab,因此是prefab

SystemIOSearchOption searchOption:因要找目录下所有的prefab,包括子孙目录,因此使用AllDirectories(若不在子孙目录中搜索则使用TopDirectoryOnly)

路径从Assets开始,因此移除前面获取到的路径中包含的游戏数据所在目录的部分,但这样就移除了“Assets”,因此再在开头将其加回

将路径中的“\”替换为“/”

因获取所有预制体可能需要较长的时间,因此用进度条显示当前执行进度

移除进度条显示:EditorUtilityClearProgressBar()

Unity中的粒子系统使用起来还是比较方便的。不过在实际过程中遇到这样的一个问题:需要动态的来控制一个粒子系统组件所能产生的最大粒子数。看doc上说是有maxParticles来控制,但实际上却没有这个开放的参数,只能通过其它的方式来实现。

这里可以通过手动产生粒子的方式来实现,也即ParticleSystem中的Emit方法,具体代码如下:

[csharp] view plain copy

public class ParticleSystemComp : MonoBehaviour

{

ParticleSystem mParticleSystem = null;

int mMaxParticles = 0;

public int maxParticles

{

get

{

return mMaxParticles;

}

set

{

mMaxParticles = value;

}

}

void Awake()

{

mParticleSystem = thisgameObjectGetComponent<ParticleSystem>();

mParticleSystememissionRate = 00f;

mMaxParticles = mParticleSystemparticleCount;

mParticleSystemClear();

}

void Update()

{

if (mParticleSystem != null)

{

if (mParticleSystemparticleCount < mMaxParticles)

{

mParticleSystemEmit(mMaxParticles - mParticleSystemparticleCount);

}

}

}

}

实现过程是对于每个ParticleSystem添加一个额外的组件,通过该组件来原始PS的更新。其中的更新原则是判断当前活动的粒子数量,如果粒子数小于指定的最大值的话就再重新生成几个新的粒子出来进行填充。

此外,出于性能考虑,其中Update内部的 *** 作也可以移至FixedUpdate中进行以减少更新次数,但是视觉上并不会带来太大的差异。

很多读者问**姐,Unity3D如何烘焙纯白的场景,这个实际上也是所有Unity从业者的共同话题,由于受环境光、灯光、相邻物体反d光等因素影响,往往白色的物体,烘焙之后都呈现灰色,为了能够烘焙出纯白的场景,**姐阅读了大量的官方文献,从官方得到这样一个公式:物体受光后的最终颜色=Ambient RenderSettings ambient setting +

(Light Color Diffuse + Light Color Specular) + Emission,于是**姐按下图所示进行了设置:

按上图所示设置烘焙之后的效果如下图所示(若有疑问可随时V询(qtpl_wx)**姐,或去淘**姐的Unity模型预处理布光烘焙后处理特效美工场景优化实战教程临摹学习):

Unity是 实时3D互动内容创作和运营平台 。

包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。

Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。

也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!

Unity小知识点学习

获取某个游戏对象下的所有子物体

在Unity中有时候我们会有这样的需求,拿到某个对象下的所有子对象然后统一做一些事情

我们可以通过GetChild的方式拿到这个物体的子对象,但是挨个拿会很麻烦

所以这里说一个可以拿到所有子对象的方法:GetComponentsInChildren

用法示例:

Unity3D 灵巧小知识点 ☀️ | 获取某个游戏对象下的所有子物体_其他

将脚本挂在到场景中,并赋值某个游戏对象

public GameObject @object;

Transform[] transforms;

void Start()

{

//游戏对象下的子物体激活的没激活的都会被拿到,包括游戏对象本身

//transforms =@objectGetComponentsInChildren<Transform>(true);

//游戏对象下的子物体激活的会被拿到,包括游戏对象本身;没激活的不会被拿到

transforms = @object GetComponentsInChildren<Transform>(false);

//遍历

foreach (Transform t in transforms)

{

//打印拿到的子对象

DebugLog("t的值为:"+t);

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

打印结果如下:

Unity3D 灵巧小知识点 ☀️ | 获取某个游戏对象下的所有子物体_非激活_02

可以通过代码控制是否要拿到非激活的子对象,这样就可以通过一个方法拿到所有子对象了!

这里顺便说一下几个常用的方法

获取某个对象子物体数量的方法

a = @objecttransformchildCount;

DebugLog("子物体的数量为:" + a);

1

2

打印结果:

Unity3D 灵巧小知识点 ☀️ | 获取某个游戏对象下的所有子物体_非激活_03

获取当前对象的索引值(当前对象为第几个子类,从0开始)

int child = transformGetSiblingIndex();

1

Unity3D 灵巧小知识点 ☀️ | 获取某个游戏对象下的所有子物体_3d_04

Unity3d中GameObject对象可以包括其他子GameObject,并且本身包括多个Component

1.GameObjectFind("myObject") or FindGameObjectByTag will search the scene for an object called myObject

2. transformFind("myObject") will only search the game objects children for an object called myObject

3.GetComponent用来获取组件。

Transform Find(String name)    Transform FindChild(String name)

查找名为name的(transformgameObject)直接子物体并返回该子物体的Transform属性。不能是孙子物体或更低辈分的子物体。

2可以在name中使用字符'\' 遍历整个路径。其中路径的根必须是transformgameObject的直接子物体,不能是孙子物体或更低辈分的子物体。

这样就可以访问到以transformgameObject为根的物体树,包括其子物体,孙子物体,曾孙物体。。。。

若Cube物体有一个直接子物体Cube1,Cube1有一个直接子物体Cube2,我们就可以在Cube的脚本中使用transformFind("Cube1/Cube2");

或transformFindChild("Cube1/Cube2");

这样就直接访问到了transformgameObject的孙子物体Cube2。

以上就是关于Unity2017.3.1f1 API过时,求问如何修改全部的内容,包括:Unity2017.3.1f1 API过时,求问如何修改、unity只能勾选一个、unity中怎样获取其他父节点的子节点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存