以下为介绍

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson14 : MonoBehaviour
{
    public UISprite A;
    public UISprite B;
    // Start is called before the first frame update
    void Start()
    {
        #region 知识点一 控件自带事件的局限性
        //目前复合控件只提供了一些常用的事件监听方式
        //比如
        //Button —— 点击
        //Toggle —— 值变化
        //等等
        //如果想要制作 按下 抬起 长按等功能 利用现在的知识是无法完成的
        #endregion

        #region 知识点二 NGUI事件 响应函数
        //添加了碰撞器的对象
        //NGUI提供了一些利用反射调用的函数
        //经过 OnHover(bool isOver)
        //按下 OnPress(bool pressed)
        //点击 OnClick()
        //双击 OnDoubleClick()
        //拖曳开始 OnDragStart()
        //拖曳中  OnDrag(Vector2 delta)
        //拖曳结束 OnDragEnd()
        //拖曳经过某对象 OnDragOver(GameObject go)
        //拖曳离开某对象 OnDragOut(GameObject go)
        //等等等等
        #endregion

        #region 知识点三 更加方便的UIEventListener和UIEventTrigger
        //他们帮助我们封装了所有 特殊响应函数
        //可以通过它进行管理添加
        //1.UIEventListener 适合代码添加
        UIEventListener listener = UIEventListener.Get(A.gameObject);
        listener.onPress += (obj, isPress) => {
            print(obj.name + "被按下或者抬起了" + isPress);
        };

        listener.onDragStart += BeginDrag;

        //2.UIEventTrigger 适合Inspector面板 关联脚本添加


        //UIEventListener和UIEventTrigger区别
        //1.Listener更适合 代码添加监听 Trigger适合拖曳对象添加监听
        //2.Listener传入的参数 更具体  Trigger就不会传入参数 我们需要在函数中去判断处理逻辑
        #endregion
    }

    private void BeginDrag(GameObject obj)
    {
        print(obj.name + "开始拖曳");
    }

    public void Press()
    {

    }

    //void OnPress(bool pressed)
    //{
    //    if( pressed )
    //    {
    //        print("按下");
    //    }
    //    else
    //    {
    //        print("抬起");
    //    }
    //}

    //void OnHover(bool isOver)
    //{
    //    if( isOver )
    //    {
    //        print("鼠标经过");
    //    }
    //    else
    //    {
    //        print("鼠标离开");
    //    }
    //}

    //void OnClick()
    //{
    //    print("点击相关");
    //}

    //void OnDoubleClick()
    //{
    //    print("双击相关");
    //}

    //void OnDragStart()
    //{
    //    print("开始拖曳");
    //}

    //void OnDrag(Vector2 delta)
    //{
    //    print("拖曳中" + delta);
    //}

    //void OnDragEnd()
    //{
    //    print("拖曳结束");
    //}

    //void OnDragOver(GameObject obj)
    //{
    //    print("拖曳经过" + obj.name);
    //}

    //void OnDragOut(GameObject obj)
    //{
    //    print("拖曳离开" + obj.name);
    //}
}

作业:绘制一个摇杆控制坦克移动

回答1:

坦克

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class TankS : MonoBehaviour
{
    public Vector3 moveDir = new Vector3(0,0,0);
    //简简单单单例
    private static TankS instance;
    public  static TankS Instance => instance;
    // Start is called before the first frame update

    private void Awake()
    {
        instance = this;
    }
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void Move(Vector3 v3)
    {
        //用向量来确定方向
        moveDir.x = v3.x;
        moveDir.z = v3.y;
        this.transform.Translate(Vector3.forward * Time.deltaTime * 10);
        this.transform.rotation = Quaternion.Lerp(this.transform.rotation,Quaternion.LookRotation(moveDir),Time.deltaTime*3);
    }
}

摇杆控制

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RockerControl : MonoBehaviour
{
    public UISprite rocker;
    public UISprite rockerBg;
    public bool isTrue;
    // Start is called before the first frame update
    void Start()
    {

        
        
        UIEventListener listener = UIEventListener.Get(rocker.gameObject);
        //摇杆拖动时
        listener.onDrag += (obj,v1) =>
        {
            
            rocker.transform.localPosition += new Vector3(v1.x, v1.y, 0);
            //当向量的模场大于130时 会将摇杆的坐标设置为其单位向量×130
            if(rocker.transform.localPosition.magnitude > 150)
            {
                rocker.transform.localPosition = rocker.transform.localPosition.normalized * 150;
            }
            isTrue = true;
           
        };
        //摇杆放掉时
        listener.onDragOut += (obg)=> 
        {
            Debug.Log("结束拖动");
            rocker.transform.localPosition = Vector3.zero;
            isTrue = false;
        };
     
    }

    // Update is called once per frame
    void Update()
    {
        //Debug.Log(rocker.gameObject.transform.localPosition.x);
        //Debug.Log(rocker.gameObject.transform.localPosition);
        //坦克移动逻辑
        if (isTrue)
        {
            TankS.Instance.Move(rocker.transform.localPosition);
        }
        


    }

}

效果

不会做游戏!