要實現技能釋放其實很簡單,說白了就是在指定的位置Instantiate一個對應的例子特效。我走的彎路主要在尋找這個指定位置上。
對於指向性技能就不多說了,因為是有確切目標的(當然首先判斷下技能能不能對目標施放等等),可以直接instantiate。
這里說下非指向技能,比如lol里曙光女神的R技能。
其實實現也很簡單,之前想麻煩了(比日說在角色要釋放技能的時候做一個設置為3d的ugui,然后再在ui上判斷技能釋放位置,
比如說將鼠標位置轉為3d坐標(這個實現下邊有。。),再比如想用時間系統像ui那樣直接拖拽,反正饒了很多彎)
好吧,我最后的實現是通過射線做的,在Update里邊時刻檢測鼠標位置,然后鼠標抬起位置就是技能釋放的位置(也就是粒子創建的位置)
為了便於觀察(比如說你按着R就會出現一個圈然后是一個通過鼠標移動控制釋放位置)我創建了一個2D的Sprite來顯示釋放位置(當然做成了預設..)。
下圖為創建的場景。就Plane表示地圖,Capsule表示角色好了。。。
直接上腳本吧,注釋應該還是蠻詳細的...我給掛在Plane上了...
public class Test : MonoBehaviour { public GameObject particle;//粒子特效預設 private RaycastHit hit; private Ray ray; private GameObject capsule;//角色 private bool keydown;//判斷是否按下對應技能鍵 private GameObject par;//要創建的例子(要釋放的技能) public GameObject firesprite;//2D Sprite的預設 private GameObject fire;//要創建的Sprite // Use this for initialization void Start() { capsule = GameObject.Find("Capsule"); } void Update() { // Vector3 gameposscreen = Camera.main.WorldToScreenPoint(capsule.transform.position); // Vector3 mouseposworld = Camera.main.ScreenToWorldPoint(new Vector3( Input.mousePosition.x,Input.mousePosition.y,gameposscreen.z)); // capsule.transform.position = new Vector3(mouseposworld.x, 1,mouseposworld.z);//這幾句就是把鼠標的屏幕坐標轉為世界坐標的...主要是鼠標的
世界坐標跟物體在同一個xoz平面上,也就是y一樣。 if (Input.GetKeyDown(KeyCode.A)) { keydown = true; fire = GameObject.Instantiate(firesprite, Vector3.zero, Quaternion.identity);//在這里創建Sprite fire.transform.Rotate(new Vector3(90, 0, 0));//旋轉成水平方向 } if (keydown) { if (Input.GetMouseButton(0)) { ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit))//射線檢測 { if (hit.collider != null) { var coll = new Vector3(hit.point.x, hit.point.y, hit.point.z);//射線檢測的位置 fire.transform.position = new Vector3(coll.x, 1, coll.z);//付給Sprite } } } if (Input.GetMouseButtonUp(0)) { par = GameObject.Instantiate(particle, fire.transform.position, Quaternion.identity);//創建粒子特效(釋放技能
Destroy(fire);
Destroy(par,5f);//摧毀
} } } }
我這個粒特效是PlayOnAwake的,如果不是瞬發技能(比如小法師的E)可以在粒子或者通過腳本設置。