众所周知,汽车在将燃料转化为动力时会排放废气。咱们可使用粒子系统来给一辆车增长一个排气口以做为车辆的装饰,从而使其更接近现实。html
对于一粒废气烟而言:git
圆柱形排气管github
Shape
模块中,选择Cone
,并将它的Angle
属性设置为0
,在这种状况下圆锥体cone其实是一个圆柱形管道Radius
取决于车辆的大小,一般能够利用场景视图中提供的Gizmo网格线框来匹配二者的大小0.05
左右(也就是5cm左右)Smoke材料(Material)web
Standard Assets
ParticleSmokeBlack
粒子系统属性配置编程
Start Lifetime
:2.5
Simulation Space
:Wolrd
Gravity Modifier
:-0.01
(也能够是其余绝对值较小的负数)Start Rotation
:将其设置为Random Between Two Constants
(在右侧的下拉菜单栏中选择),而后将这两个常数值设置为0
和360
接下来配置烟雾向外翻滚和消散的效果:dom
粒子Color over Lifetime
模块ide
0
,由此场景中的烟雾粒子将具备逐渐消失为0的效果(实际上预制中已配置好了)粒子Size Over Lifetime
模块svg
Size
的选择取决于排气管的尺寸(稍大于排气管尺寸的Size可使效果更逼真)Particle System
模块中的Start Size
最后,配置当烟散开时减慢速度的效果:网站
Force Over Lifetim
模块
Space
:Local
Z
:一个负值,如:-0.75
(系统沿对象局部空间的正Z方向发射粒子的状况下,不然则设置正值)思路:若是脚本中有一个表示发动机转速或车辆速度的变量,则只需将该值乘以一个常数,而后将结果赋给particlesystem的emissionrate属性。this
为此,我设计了一个简单的小游戏以表示各个不一样的场景
道路road
:
KajamansRoads
,自行选用其Free/Prefabs目录下的一个道路汽车Car
:
下载并导入资源Retro Cartoon Car Cicada
合理布置于场景中
挂载JoyStick.cs
代码实现虚拟轴控制汽车移动
//JoyStick.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class JoyStick : MonoBehaviour { private float speedX = 150F; private float speedZ = 15F; // Update is called once per frame void Update() { float translationZ = Input.GetAxis("Vertical") * speedZ; float translationX = Input.GetAxis("Horizontal") * speedX; translationZ *= Time.deltaTime; translationX *= Time.deltaTime; transform.Translate(0, 0, translationZ); transform.Rotate(0, translationX, 0); } }
设置主相机跟随,将CameraFollow.cs
代码挂载在Main Camera
对象下,并将Car
游戏对象拖动赋值给脚本中的follow
//CameraFollow.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraFollow : MonoBehaviour { public GameObject follow; //跟随的物体 public float smothing = 5f; //相机跟随的速度 Vector3 offset; //相机与物体相对偏移位置 void Start() { offset = transform.position - follow.transform.position; } void FixedUpdate() { if (follow != null) { Vector3 target = follow.transform.position + offset; //摄像机自身位置到目标位置平滑过渡 transform.position = Vector3.Lerp(transform.position, target, smothing * Time.deltaTime); } } }
挂载SmokeEmission.cs
脚本,实现烟雾粒子发射随不一样场景变化效果
//SmokeEmission.cs //设置烟雾粒子生成地的坐标随汽车坐标移动变换 GameObject smoke = null; if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1 || Mathf.Abs(Input.GetAxis("Horizontal")) > 0.1) { smoke = Instantiate(Resources.Load<GameObject>("Prefabs/Smoke"), new Vector3(this.gameObject.transform.position.x - 0.635f, this.transform.position.y + 0.17f, this.transform.position.z - 1.6f), Quaternion.identity); float tranlationZ = Input.GetAxis("Vertical") * speedZ; smoke.GetComponent<ParticleSystem>().emissionRate = engineCoeffient * tranlationZ; } ... //汽车发生故障(与障碍物发生碰撞)后烟雾粒子效果变化以及故障恢复 float engineCoeffient = 2.5f; bool break_down = false; int recover_time = 500; if (Vector3.Distance(this.gameObject.transform.position, barrier_pos) < 1.5f) { //car is break down break_down = true; engineCoeffient = 10; } if (break_down) { if (recover_time == 0) { break_down = false; recover_time = 500; engineCoeffient = 2.5f; } else { recover_time--; } }
障碍物Barrier
:
IndustrialEnvironment
,自行选用TrafficBarriers/Prefabs目录下的一个障碍物做为预制,置于目录Assets/Resources/Prefabs下//SmokeEmission.cs float old_pos_z; void Start() { old_pos_z = this.gameObject.transform.position.z; } void Update() { ... shift += (this.gameObject.transform.position.z - old_pos_z); old_pos_z = this.gameObject.transform.position.z; if (shift >= 100) { barrier_pos = new Vector3(this.gameObject.transform.position.x-1, this.gameObject.transform.position.y, this.gameObject.transform.position.z + 30); barrier = Instantiate(Resources.Load<GameObject>("Prefabs/Barrier"), barrier_pos, Quaternion.identity); shift = 0; } ... }
完整代码参考——>代码传送门