public void MagicGuidePartical_CallBack() { CollisionHitCallbackStruct data = new CollisionHitCallbackStruct() { targetObj = target, hitPoint = target ? target.transform.position : Vector3.zero }; //真正的回调 bool result = false; if (CollisionCallback != null) { result = CollisionCallback(data); } //如果结果判定可以触发效果则触发 if (result && CollisionCallback != null) { //在该位置生成粒子 if (CollisionPartical) { GameObject go = GameObject.Instantiate(CollisionPartical); go.transform.position = data.hitPoint + Vector3.up * 1.5f; ParticalControlEntry collisionEntry = go.GetComponent <ParticalControlEntry>(); if (collisionEntry) { collisionEntry.Init(go.transform.position, collisionForward, collisionColor, 0, null, collisionRange, target); } } } }
/// <summary> /// 开火 /// </summary> void StormRaids_Shot() { tempShotCount++; if (tempShotCount > MaxShotCount) { CancelInvoke("StormRaids_Shot"); return; } //生成新的发射 GameObject go = GameObject.Instantiate(tempChildObj); go.transform.SetParent(transform); go.transform.position = transform.position + go.transform.TransformPoint(new Vector3(UnityEngine.Random.Range(-4, 4), UnityEngine.Random.Range(0, 4), 0)); Vector3 thisForward = (transform.position + transform.forward * 20 - go.transform.position).normalized; go.transform.forward = thisForward; ParticalControlEntry particalControlEntry = go.GetComponent <ParticalControlEntry>(); if (particalControlEntry != null) { particalControlEntry.Init(go.transform.position, go.transform.forward, Color.red, layerMask, CollisionCallback, 1); } go.SetActive(true); StormRaids_Shot(); }
/// <summary> /// 在显示的时候检测一次 /// </summary> private void OnEnable() { if (range > 0 && CallBack != null) { Ray ray = new Ray(transform.position, transform.forward); RaycastHit[] rchs = Physics.RaycastAll(ray, range, layerMask); List <GameObject> objsList = new List <GameObject>(); if (rchs != null && rchs.Length > 0) { rchs = rchs.OrderBy(temp => Vector3.Distance(temp.point, transform.position)).ToArray(); foreach (RaycastHit rch in rchs) { if (objsList.Contains(rch.transform.gameObject)) { continue; } objsList.Add(rch.transform.gameObject); bool result = CallBack(new CollisionHitCallbackStruct() { targetObj = rch.transform.gameObject, hitPoint = rch.point }); if (result) { //生成粒子 GameObject go = GameObject.Instantiate(collisionObj); go.transform.position = rch.point; ParticalControlEntry particalControlEntry = go.GetComponent <ParticalControlEntry>(); if (particalControlEntry) { particalControlEntry.Init(rch.point, transform.forward, color, layerMask, CallBack, 1);//这里的范围不起作用 } else { go.transform.forward = -transform.forward; } if (onlyNear)//只生成第一个 { break; } } } } } }
/// <summary> /// 发射 /// </summary> void LightningImpact_Shot() { Ray ray = new Ray(transform.position, transform.forward); RaycastHit[] rchs = Physics.RaycastAll(ray, range, layerMask); rchs = Physics.CapsuleCastAll(transform.position, transform.position + transform.forward, 0.5f, transform.forward, range * 10); if (rchs != null && rchs.Length > 0 && CallBack != null) { List <GameObject> objList = new List <GameObject>(); foreach (RaycastHit rch in rchs) { if (objList.Contains(rch.transform.gameObject)) { continue; } objList.Add(rch.transform.gameObject); bool result = CallBack(new CollisionHitCallbackStruct() { targetObj = rch.transform.gameObject, hitPoint = rch.point }); if (result) { //生成粒子 GameObject go = GameObject.Instantiate(collisionObj); Destroy(go, 5); go.transform.position = rch.point; ParticalControlEntry particalControlEntry = go.GetComponent <ParticalControlEntry>(); if (particalControlEntry) { particalControlEntry.Init(rch.point, transform.forward, Color.red, layerMask, null, 1);//这里的范围不起作用 } else { go.transform.forward = -transform.forward; } } } } Invoke("LightningImpact_Shot", checkIntervalTime); }
/// <summary> /// 开火 /// </summary> void RoarOfEarth_Shot() { tempShotCount++; if (tempShotCount > MaxShotCount) { CancelInvoke("RoarOfEarth_Shot"); return; } //生成新的发射 GameObject go = GameObject.Instantiate(tempChildObj); go.transform.SetParent(transform); go.transform.position = transform.position + transform.forward * tempShotCount * EveryDistance; go.transform.forward = transform.forward; ParticalControlEntry particalControlEntry = go.GetComponent <ParticalControlEntry>(); if (particalControlEntry != null) { particalControlEntry.Init(go.transform.position, go.transform.forward, Color.red, layerMask, CollisionCallback, 1); } go.SetActive(true); }