要實現技能釋放其實很簡單,說白了就是在指定的位置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)可以在粒子或者通過腳本設置。
