[Unity3D] 技能释放方向指示的一种实现方式(移动平台)

编程入门 行业动态 更新时间:2024-10-08 22:59:23

[Unity3D] 技能释放方向<a href=https://www.elefans.com/category/jswz/34/1708306.html style=指示的一种实现方式(移动平台)"/>

[Unity3D] 技能释放方向指示的一种实现方式(移动平台)

基本原理:通过Input.GetTouch().position,获得触摸位置并根据手指移动方向来计算出技能释放方向,然后通过LIneRenderer生成方向指示线,实现类似于《王者荣耀》指向性技能释放时的方向指示效果。
void Update(){

//假设触摸点1正在用于控制角色方向;触摸点2位于屏幕右侧,该侧有技能按钮;
if (Input.touchCount>0 && Input.GetTouch(1).position.x > Screen.width/2) {//触摸点2被触碰if (Input.GetTouch(1).phase == TouchPhase.Began){//获得第二个触摸点的位置,并保存,将用作计算相对位置的基点m_DragStartPoint = Input.GetTouch(1).position;}// 触摸点2在移动if (Input.GetTouch(1).phase == TouchPhase.Moved){// 根据触摸点2的位置,计算需要的方向向量;CalDir(Input.GetTouch(1).position);// 计算全局坐标系下的Z方向至上一步得到的方向向量的夹角;m_rotAngle = AngleBetweenVector3(Vector3.forward, m_TouchDeltaDir);// 调用LineRenderer绘制线段DrawLine (m_LineStartPosition.position,m_LineEnd);// 根据该夹角,计算技能释放时所需的旋转Quanternionm_SpellRotation = Quaternion.Euler(0,m_rotAngle,0);//触摸点2保持静止  }else if(Input.GetTouch(1).phase == TouchPhase.Stationary){// 这一步原理同上,用于确保角色移动时线段的起点能够与角色同步CalDir(Input.GetTouch(1).position);DrawLine (m_LineStartPosition.position,m_LineEnd);//触摸点2终止,手指离开屏幕 }else if(Input.GetTouch(1).phase == TouchPhase.Ended){// 这里调用你的技能,实现技能释放;// 由于这里用了ParitcleSystem作为被释放的技能,对应的transform在初始化时无Rotation,也就是transform.forward与Vector3.forward一致,因此,在释放技能时,需要将之前得到的Quanterniou作为参数,在ParticleSystem生成时便旋转至与方向指示线一致的方向。m_Spell.SpellCast (1,m_SpellRotation,0);//停止线段绘制;DropLine();}//DrawLine (m_LineStartPosition.position,m_LineEnd);
}

}

void CalDir(Vector2 touchposition){
// 计算自初始触摸位置至当前触摸位置的向量
m_TouchDeltaPosition = touchposition - m_DragStartPoint;
// 注意: Input.Touch().Position 得到的是Vector2;
// 将Vector2 转化为Vector3,由于是在X-Z平面绘制,所以Y方向为0;
m_TouchDeltaDir = new Vector3(m_TouchDeltaPosition.x, 0, m_TouchDeltaPosition.y);
// 上一步得到一个在全局坐标系下,触摸位置相对于基点的方向向量;
// 接下来便可以利用这个方向向量,从角色的位置画出一条直线作为技能释放方向的指示。

// 计算直线的绘制终点
m_LineEnd = m_LineStartPosition.position + m_TouchDeltaDir.normalized * 10f;

}

float AngleBetweenVector3(Vector3 vec1, Vector3 vec2){

float sign = (vec2.x < vec1.x) ? -1.0f : 1.0f;
return (Vector3.Angle (vec1,vec2) ) * sign;

}

void DrawLine(Vector3 start,Vector3 end){
if (!GetComponent ()) {
m_LineRenderer = gameObject.AddComponent ();
}

m_LineRenderer.enabled = true;
m_LineRenderer.startColor = Color.red;
m_LineRenderer.endColor = Color.red;
m_LineRenderer.startWidth = 0.2f;
m_LineRenderer.endWidth = 0.2f;
m_LineRenderer.SetPosition (0,start);
m_LineRenderer.SetPosition (1,end);

}

void DropLine(){
if (!GetComponent ()) {
return;
} else {
m_LineRenderer.enabled = false;
}
}

//m_Spell.SpellCast
public void SpellCast(…){

// m_Spell 对应所释放的技能,是一个以ParticleSystem为基础的特效;
// SpellCastPosition 是技能释放位置,也就是ParticleSystem开始的位置;
// m_SpellRotation 是ParticleSystem的旋转量;
GameObject spell = (GameObject)Instantiate (m_Spell, SpellCastPosition, m_SpellRotation);

}

做完之后的效果就是下面这个样子,这条线虽然看起来很丑,但是用来瞄准还是很实用的。

技能方向 (1).gif

作者:薯條
链接:
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

更多推荐

[Unity3D] 技能释放方向指示的一种实现方式(移动平台)

本文发布于:2024-02-13 22:43:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1760991.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:指示   技能   方向   方式   平台

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!