标签:
一、解决由于子弹射击速度过快而无法打到物体的问题
//方法一: public float Speed = 800; Vector3 originalPos; void Update() { originalPos = transform.position; //获取子弹现在的位置 transform.Translate(Vector3.forward * Speed * Time.deltaTime); //移动子弹,每秒移动800米 Vector3 direction = transform.position - originalPos; //获取子弹移动的方向 float distance = (transform.position - originalPos).magnitude; //获取子弹移动的距离 RaycastHit hit; if (Physics.Raycast(originalPos, direction, out hit, distance)) { //其他逻辑操作。。。 } } //方法二: public float Speed = 100000; Vector3 startPos; Vector3 endPos; void Start() { //给子弹施加一个向前的力 GetComponent<Rigidbody>().AddForce(Vector3.forward * Speed, ForceMode.Force); } void Update() { startPos=endPos; endPos=transform.position; float distance = (startPos - endPos).magnitude; //获取子弹移动的距离 Ray r = Camera.main.ScreenPointToRay(startPos); RaycastHit hit; if (Physics.Raycast(r, out hit, distance)) { //其他逻辑操作。。。 } }
二、解决弹痕的位置问题
因为弹痕是一个贴图,所以当射击到某个点上时,我们要把此贴图贴在此点上面,具体实现代码如下:
GameObject goo = Instantiate(go, hit.point, Quaternion.identity) as GameObject;//实例化一张弹痕贴图 goo.transform.LookAt(hit.point - hit.normal); //使弹痕贴图面向法线上的点 LookAt:旋转物体使z轴指向目标物体。 goo.transform.Translate(Vector3.back * 0.01f); //使弹痕贴图向上移一点,避免贴图与地面重合而造成弹痕贴图显示不正常或无法显示
三、设置弹痕缓慢消失的效果
public float speed = 0.3f; private float lefttime = 0; Material meterial; void Start() { meterial = renderer.material; } void Update() { if (meterial.color.a < 0.005) { Destroy(this.gameObject); } lefttime += Time.deltaTime; if (lefttime > 2f) //弹痕出现2秒后,开始执行逐渐透明效果 { meterial.color = Color.Lerp(meterial.color, Color.clear, speed * Time.deltaTime); // Color.clear 为透明色,设置物体逐渐透明 } }
标签:
原文地址:http://www.cnblogs.com/MrZivChu/p/CSshoot.html