[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);
            // 根据该夹角,计算技能释放时所需的旋转Quanternion
            m_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<LineRenderer> ()) {
        m_LineRenderer = gameObject.AddComponent<LineRenderer> ();
    }

    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<LineRenderer> ()) {
        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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容