以下为介绍
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);
}
}
}
效果