unity 手指旋轉(zhuǎn)角色的功能

unity 手指旋轉(zhuǎn)角色的功能

1. 需求說明

1.1 可以用手指進行旋轉(zhuǎn)。
1.2 點擊角色時可以觸發(fā)事件

2. Unity 鼠標點擊3D物體的方法

2.1 第一種 OnMouse

在需要檢測的物體上 首先物體要有Collider 添加腳本 使用OnMouse系列方法(腳本的enable不影響OnMouse的調(diào)用)

    //當鼠標懸停在網(wǎng)格上時敢茁,
    void OnMouseEnter()
    {
       
    } 
 
    // ...當鼠標懸浮在物體上
    void OnMouseOver()
    {
    
    } 
 
    // ...當鼠標移開時
    void OnMouseExit()
    {
       
    }
    // ...當鼠標點擊
    void OnMouseDown()
    {
       
    }
    // ...當鼠標抬起
    void OnMouseUp()
    {
       
    }

2.2 第二種方法 射線檢測(首先物體要有Collider 然后掛載腳本)

using UnityEngine;
using System.Collections;
 
public class RayCastHitControl : MonoBehaviour 
{
    Ray ray;
    RaycastHit hit;
    GameObject obj;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log("點擊鼠標左鍵");
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log(hit.collider.gameObject.name);
                obj = hit.collider.gameObject;
                //通過名字
                if (obj.name.Equals("BeiJiuChuan"))
                {
                    Debug.Log("點中"+obj.name);
                }
                //通過標簽
                if (obj.tag == "move")
                {
                    Debug.Log("點中" + obj.name);
                }
            }
        }
    }
}

2.3 第三種方法 游戲物體 EventTrigger 物體動態(tài)事件監(jiān)聽

先說一下 有哪些封裝好的公共方法

OnBeginDrag         //在拖動開始之前調(diào)用稍刀。
OnCancel            //發(fā)生Cancel事件時由EventSystem調(diào)用快骗。
OnDeselect          //在選擇新對象時由EventSystem調(diào)用。
ondragDown          //每次在拖動期間移動指針時由EventSystem調(diào)用。
OnDrop              //當對象接受丟棄時由EventSystem調(diào)用唁影。
OnEndDrag           //拖動結(jié)束后由EventSystem調(diào)用耕陷。
OnInitializePotentialDrag   //在找到拖動時,但在有效開始拖動之前由EventSystem調(diào)用据沈。
OnMove              //發(fā)生Move事件時由EventSystem調(diào)用哟沫。
OnPointerClick      //發(fā)生Click事件時由EventSystem調(diào)用。
OnPointerDown       //發(fā)生PointerDown事件時由EventSystem調(diào)用锌介。
OnPointerEnter      //當指針進入與此EventTrigger關(guān)聯(lián)的對象時由EventSystem調(diào)用嗜诀。
OnPointerExit       //當指針退出與此EventTrigger關(guān)聯(lián)的對象時,由EventSystem調(diào)用孔祸。
OnPointerUp         //發(fā)生PointerUp事件時由EventSystem調(diào)用隆敢。
OnScroll            //當Scroll事件發(fā)生時由EventSystem調(diào)用。
ONSELECT            //當Select事件發(fā)生時由EventSystem調(diào)用崔慧。
OnUpdateSelected    //更新與此EventTrigger關(guān)聯(lián)的對象時由EventSystem調(diào)用拂蝎。

然后說一下使用方法

1.通過編輯器中添加

在Inspector中添加EventTrigger的componnent組件,然后點擊Add New Event Type按鈕添加一個基本的事件

image.png
image.png

當我們選擇一個事件的時候惶室,就相當于將要于此事件綁定了温自,例如當我們選擇Pointer Click的時候,綁定了這個組件的物體將接受Pointer Click 事件的消息皇钞,當我們在物體上按下鼠標的時候悼泌,(當然空間中的物體我們是無法通過鼠標點擊的,但是當我們可以通過射線碰撞的方法鹅士,來實現(xiàn)Pointer Enter券躁,Pointer Exit等事件的觸發(fā))這里我們用來綁定這個EventTrigger 的是一個UI Panel 這樣便可以讓它接受我們自定義的單擊事件了


image.png
image.png
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using UnityEngine.Events;
 
public class OnClickMouseDown : MonoBehaviour
{
  
    void Start()
    {
        //獲取或添加EventTrigger組件
        EventTrigger trigger = transform.GetComponent<EventTrigger>();
        if (trigger == null)
        {
            trigger = transform.gameObject.AddComponent<EventTrigger>();
        }
        //初始化EventTrigger.Entry的數(shù)組
        trigger.triggers = new List<EventTrigger.Entry>();
        //創(chuàng)建各種 EventTrigger.Entry的類型
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerEnter;//設(shè)置Entry的eventID類型 即EventTriggerType的各種枚舉(比如鼠標點擊,滑動掉盅,拖動等)
        UnityAction<BaseEventData> callback =new UnityAction<BaseEventData>(OnEventTrigger);  //注冊代理
        entry.callback.AddListener(callback);//添加代理事件到EventTrigger.Entry
        EventTrigger.Entry entry2 = new EventTrigger.Entry();
        entry2.eventID = EventTriggerType.PointerDown;
        UnityAction<BaseEventData> callback1 =new UnityAction<BaseEventData>(OnMouseDown);
        entry2.callback.AddListener(callback1);
 
        //在EventTrigger.Entry的數(shù)組添加EventTrigger.Entry
        trigger.triggers.Add(entry);
        trigger.triggers.Add(entry2);
    }
 
    private void OnMouseDown(BaseEventData arg0)
    {
        Debug.Log("OnMouseDown");
    }
 
    private void OnEventTrigger(BaseEventData arg0)
    {
        Debug.Log("OnEventTrigger");
    }
}

最后 別忘了 在攝像機下添加一個Physics Raycaster的組件也拜,用來檢測鼠標射線


image.png
image.png

3. 具體實現(xiàn)

考慮到以后的擴展,我們使用第三種方式來實現(xiàn)具體的功能趾痘。

using System;
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

namespace Tuyoo
{
    public class MoveTarget : EventTrigger
    {
        //對外提供的點擊回調(diào)
        public Action clickAct = null;

        public bool isClick = false;

        void Start()
        {
            EventTriggerListener.GetListener(gameObject).onDrag += onDrag;
            EventTriggerListener.GetListener(gameObject).onBeginDrag += onBeginDrag;
            EventTriggerListener.GetListener(gameObject).onPointerClick += onPointerClick;
            EventTriggerListener.GetListener(gameObject).onPointerUp += onPointerUp;
        }

        private float beginfloat = 0;
        public void onBeginDrag(GameObject go, PointerEventData eventData)
        {
            beginfloat = eventData.position.x;
        }

        public void onDrag(GameObject go, PointerEventData eventData)
        {
            isClick = false;
            transform.localRotation = Quaternion.Euler(transform.localRotation.eulerAngles.x, transform.localRotation.eulerAngles.y - (eventData.position.x - beginfloat), transform.localRotation.eulerAngles.z);
            beginfloat = eventData.position.x;
        }
        
        public void onPointerUp(GameObject go, PointerEventData eventData)
        {
            // 點擊容錯處理慢哈,只有在0.1秒內(nèi),松開手指并且沒有移動事件觸發(fā)永票,才算點擊卵贱。
            StartCoroutine(delayTime(0.1f));
        }

        private IEnumerator delayTime(float numtimes)
        {
            yield return WaitForTimeMgr.Instance.GetWaitForSeconds(numtimes);
            isClick = true;
        }

        public void onPointerClick(GameObject go, PointerEventData eventData)
        {
            if (clickAct != null && isClick)
            {
                clickAct();
            }
        }
    }
}
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
 
public class EventTriggerListener : EventTrigger
{
    #region 變量
    //帶參數(shù)是為了方便取得綁定了UI事件的對象  
    public delegate void PointerEventDelegate(GameObject go, PointerEventData eventData);
    public delegate void BaseEventDelegate(GameObject go, BaseEventData eventData);
    public delegate void AxisEventDelegate(GameObject go, AxisEventData eventData);
 
    public event PointerEventDelegate onPointerEnter;
    public event PointerEventDelegate onPointerExit;
    public event PointerEventDelegate onPointerDown;
    public event PointerEventDelegate onPointerUp;
    public event PointerEventDelegate onPointerClick;
    public event PointerEventDelegate onInitializePotentialDrag;
    public event PointerEventDelegate onBeginDrag;
    public event PointerEventDelegate onDrag;
    public event PointerEventDelegate onEndDrag;
    public event PointerEventDelegate onDrop;
    public event PointerEventDelegate onScroll;
    public event BaseEventDelegate onUpdateSelected;
    public event BaseEventDelegate onSelect;
    public event BaseEventDelegate onDeselect;
    public event AxisEventDelegate onMove;
    public event BaseEventDelegate onSubmit;
    public event BaseEventDelegate onCancel;
    #endregion
 
    public static EventTriggerListener GetListener(GameObject go)
    {
        EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
        if (listener == null) listener = go.AddComponent<EventTriggerListener>();
        return listener;
    }
 
    #region 方法
    public override void OnPointerEnter(PointerEventData eventData)
    {
        if (onPointerEnter != null) onPointerEnter(gameObject, eventData);
    }
    public override void OnPointerExit(PointerEventData eventData)
    {
        if (onPointerExit != null) onPointerExit(gameObject, eventData);
    }
    public override void OnPointerDown(PointerEventData eventData)
    {
        if (onPointerDown != null) onPointerDown(gameObject, eventData);
    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        if (onPointerUp != null) onPointerUp(gameObject, eventData);
    }
    public override void OnPointerClick(PointerEventData eventData)
    {
        if (onPointerClick != null) onPointerClick(gameObject, eventData);
    }
    public override void OnInitializePotentialDrag(PointerEventData eventData)
    {
        if (onInitializePotentialDrag != null) onInitializePotentialDrag(gameObject, eventData);
    }
    public override void OnBeginDrag(PointerEventData eventData)
    {
        if (onBeginDrag != null) onBeginDrag(gameObject, eventData);
    }
    public override void OnDrag(PointerEventData eventData)
    {
        if (onDrag != null) onDrag(gameObject, eventData);
    }
    public override void OnEndDrag(PointerEventData eventData)
    {
        if (onEndDrag != null) onEndDrag(gameObject, eventData);
    }
    public override void OnDrop(PointerEventData eventData)
    {
        if (onDrop != null) onDrop(gameObject, eventData);
    }
    public override void OnScroll(PointerEventData eventData)
    {
        if (onScroll != null) onScroll(gameObject, eventData);
    }
    public override void OnUpdateSelected(BaseEventData eventData)
    {
        if (onUpdateSelected != null) onUpdateSelected(gameObject, eventData);
    }
    public override void OnSelect(BaseEventData eventData)
    {
        if (onSelect != null) onSelect(gameObject, eventData);
    }
    public override void OnDeselect(BaseEventData eventData)
    {
        if (onDeselect != null) onDeselect(gameObject, eventData);
    }
    public override void OnMove(AxisEventData eventData)
    {
        if (onMove != null) onMove(gameObject, eventData);
    }
    public override void OnSubmit(BaseEventData eventData)
    {
        if (onSubmit != null) onSubmit(gameObject, eventData);
    }
    public override void OnCancel(BaseEventData eventData)
    {
        if (onCancel != null) onCancel(gameObject, eventData);
    }
    #endregion
}

將腳本掛到要旋轉(zhuǎn)的物體上就可以進行旋轉(zhuǎn)了。


image.png
image.png

效果如下圖:


Jietu20200504-095321-HD.gif
Jietu20200504-095321-HD.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侣集,一起剝皮案震驚了整個濱河市键俱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌世分,老刑警劉巖编振,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臭埋,居然都是意外死亡踪央,警方通過查閱死者的電腦和手機臀玄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畅蹂,“玉大人健无,你說我怎么就攤上這事∫盒保” “怎么了累贤?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旗唁。 經(jīng)常有香客問我畦浓,道長,這世上最難降的妖魔是什么检疫? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任讶请,我火速辦了婚禮,結(jié)果婚禮上屎媳,老公的妹妹穿的比我還像新娘夺溢。我一直安慰自己,他們只是感情好烛谊,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布风响。 她就那樣靜靜地躺著,像睡著了一般丹禀。 火紅的嫁衣襯著肌膚如雪状勤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天双泪,我揣著相機與錄音持搜,去河邊找鬼。 笑死焙矛,一個胖子當著我的面吹牛葫盼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播村斟,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼贫导,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蟆盹?” 一聲冷哼從身側(cè)響起孩灯,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逾滥,沒想到半個月后钱反,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡匣距,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年面哥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毅待。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡尚卫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尸红,到底是詐尸還是另有隱情吱涉,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布外里,位于F島的核電站怎爵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盅蝗。R本人自食惡果不足惜鳖链,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墩莫。 院中可真熱鬧芙委,春花似錦、人聲如沸狂秦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裂问。三九已至侧啼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堪簿,已是汗流浹背痊乾。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戴甩,地道東北人符喝。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像甜孤,于是被迫代替她去往敵國和親协饲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344