1,利用随机数处理拖尾特效(续上)
2,协程
3,预置件(预置体)
1,利用随机数处理拖尾特效(续上)
代码比较简单就是用随机数随便选一种粒子特效(有点像激光束的感觉),就不做过多讲解,补充上一博客!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletMove : MonoBehaviour
{
public float BulletSpeed = 100f;//子弹移动速度
private Vector3 velocity;
public float destotryTime = 4.0f;//子弹销毁时间
//VFX添加粒子效果
public GameObject impactVFX1;
public GameObject impactVFX2;
public GameObject impactVFX3;
public GameObject impactVFX4;
public GameObject impactVFX5;
public GameObject impactVFX6;
public GameObject impactVFX7;
public GameObject impactVFX8;
public int n=1;//烟花选择
public float VFXLifetime=0.25f;//VFX销毁时间
public Transform Bullet;//子弹
//随机拖尾选择
void Start()
{
velocity = transform.forward * BulletSpeed;
Destroy(gameObject, destotryTime);
n = (int)Random.Range(1, 9);
}
void Update()
{
Fire( n);
}
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Wall" || other.tag == "Robot")
{
Destroy(gameObject);
}
}
private void Fire(int n)//进行选择然后调用
{
if(n==1)
{
GameObject impactVFXInstance = Instantiate(impactVFX1, Bullet.position, Bullet.rotation);
Destroy(impactVFXInstance, VFXLifetime);
transform.position += velocity * Time.deltaTime;
}
if (n == 2)
{
GameObject impactVFXInstance = Instantiate(impactVFX2, Bullet.position, Bullet.rotation);
Destroy(impactVFXInstance, VFXLifetime);
transform.position += velocity * Time.deltaTime;
}
if (n == 3)
{
GameObject impactVFXInstance = Instantiate(impactVFX3, Bullet.position, Bullet.rotation);
Destroy(impactVFXInstance, VFXLifetime);
transform.position += velocity * Time.deltaTime;
}
if (n == 4)
{
GameObject impactVFXInstance = Instantiate(impactVFX4, Bullet.position, Bullet.rotation);
Destroy(impactVFXInstance, VFXLifetime);
transform.position += velocity * Time.deltaTime;
}
if (n == 5)
{
GameObject impactVFXInstance = Instantiate(impactVFX5, Bullet.position, Bullet.rotation);
Destroy(impactVFXInstance, VFXLifetime);
transform.position += velocity * Time.deltaTime;
}
if (n == 6)
{
GameObject impactVFXInstance = Instantiate(impactVFX6, Bullet.position, Bullet.rotation);
Destroy(impactVFXInstance, VFXLifetime);
transform.position += velocity * Time.deltaTime;
}
if (n == 7)
{
GameObject impactVFXInstance = Instantiate(impactVFX7, Bullet.position, Bullet.rotation);
Destroy(impactVFXInstance, VFXLifetime);
transform.position += velocity * Time.deltaTime;
}
if (n == 8)
{
GameObject impactVFXInstance = Instantiate(impactVFX8, Bullet.position, Bullet.rotation);
Destroy(impactVFXInstance, VFXLifetime);
transform.position += velocity * Time.deltaTime;
}
}
}
2,协程
????????????????????????协程Coroutine | ???????????????????????????????????普通函数 | 协程可以在运行到特定指令后返回,等下一帧或者特定时间后继续运行 | 普通函数会在返回前执行完所有的指令,意味着函数内的指令会在一帧内完成 |
在Unity运行时,调用协程就是开启了一个IEnumerator(迭代器),协程开始执行,在执行到yield?return之前和其他的正常的程序没有差别,但是当遇到yield?return之后会立刻返回,并将该函数暂时挂起。在下一帧遇到FixedUpdate或者Update之后判断yield?return?后边的条件是否满足,如果满足向下执行。
协调程序主要是在Update()方法之后,LateUpdate()方法之后调用!
协程的主要应用:协程不是只能做一些简单的延迟,如果只是单纯的暂停几秒然后再执行就完全没有必要再开启一个线程了。协程真正的作用是分步做一些比较耗时的事情,比如加载游戏资源......
IEnumerator 函数名()//协程函数的返回值
{
内部通常为一个循环
yield return null;相当于每帧循环一次
或者yield return new WaitForSeconds(0.1f);
//等待0.1秒继续进入这个协程,直到循环结束
}
可以通过StopCoroutine(停止当前协程)或者StopAllCoroutines(停止所有协程)停止协程。
3,预置件(预置体)
预制件Prefab的作用:
? ? ? ? 1)可重用的有特定组件、属性和子物体的游戏对象。
? ? ? ? 2)类似于模板,将物体按照模板在场景中实例化。
? ? ? ? 3)对预制件的修改会影响到所有实例化的物体。
可重复利用销毁后直接在Prefab里面直接取!
?在脚本中使用Instantiate对预置体进行“提取”,到达一直用的效果(比如子弹)
比如在1中我用到了子弹预置体和VFX预置体.....
|