EasyTouch是 由 The.Hedgehog.Team 写的插件 刺猬工作室。。。
QuickBase 是 Quick Drag ,Qucik Touch,Quick Swipe...的父类 是一个比较重要的类,很多子类都是从它身上衍生的。
using UnityEngine;
using System.Collections;
namespace HedgehogTeam.EasyTouch{
public class QuickBase : MonoBehaviour {
#region enumeration
protected enum GameObjectType { Auto,Obj_3D,Obj_2D,UI};
public enum DirectAction {None,Rotate, RotateLocal,Translate, TranslateLocal, Scale};
public enum AffectedAxesAction {X,Y,Z,XY,XZ,YZ,XYZ};
#endregion
#region Members
public string quickActionName;
// Touch management
public bool isMultiTouch = false;
public bool is2Finger = false;
public bool isOnTouch=false;
public bool enablePickOverUI = false;
public bool resetPhysic = false;
// simple Action
public DirectAction directAction;
public AffectedAxesAction axesAction;
public float sensibility = 1;
public CharacterController directCharacterController;
public bool inverseAxisValue = false;
protected Rigidbody cachedRigidBody;
protected bool isKinematic;
protected Rigidbody2D cachedRigidBody2D;
protected bool isKinematic2D;
// internal management
protected GameObjectType realType;
protected int fingerIndex =-1;
#endregion
#region Monobehavior Callback
void Awake(){
cachedRigidBody = GetComponent<Rigidbody>();
if (cachedRigidBody){
isKinematic = cachedRigidBody.isKinematic;
}
cachedRigidBody2D = GetComponent<Rigidbody2D>();
if (cachedRigidBody2D){
isKinematic2D = cachedRigidBody2D.isKinematic;
}
}
public virtual void Start(){
EasyTouch.SetEnableAutoSelect( true);
realType = GameObjectType.Obj_3D;
if (GetComponent<Collider>()){
realType = GameObjectType.Obj_3D;
}
else if (GetComponent<Collider2D>()){
realType = GameObjectType.Obj_2D;
}
else if (GetComponent<CanvasRenderer>()){
realType = GameObjectType.UI;
}
switch (realType){
case GameObjectType.Obj_3D:
LayerMask mask = EasyTouch.Get3DPickableLayer();
mask = mask | 1<<gameObject.layer;
EasyTouch.Set3DPickableLayer( mask);
break;
//2D
case GameObjectType.Obj_2D:
EasyTouch.SetEnable2DCollider( true);
mask = EasyTouch.Get2DPickableLayer();
mask = mask | 1<<gameObject.layer;
EasyTouch.Set2DPickableLayer( mask);
break;
// UI
case GameObjectType.UI:
EasyTouch.instance.enableUIMode = true;
EasyTouch.SetUICompatibily( false);
break;
}
if (enablePickOverUI){
EasyTouch.instance.enableUIMode = true;
EasyTouch.SetUICompatibily( false);
}
}
public virtual void OnEnable(){
//QuickTouchManager.instance.RegisterQuickAction( this);
}
public virtual void OnDisable(){
//if (QuickTouchManager._instance){
// QuickTouchManager.instance.UnregisterQuickAction( this);
//}
}
#endregion
#region Protected Methods
protected Vector3 GetInfluencedAxis(){
Vector3 axis = Vector3.zero;
switch(axesAction){
case AffectedAxesAction.X:
axis = new Vector3(1,0,0);
break;
case AffectedAxesAction.Y:
axis = new Vector3(0,1,0);
break;
case AffectedAxesAction.Z:
axis = new Vector3(0,0,1);
break;
case AffectedAxesAction.XY:
axis = new Vector3(1,1,0);
break;
case AffectedAxesAction.XYZ:
axis = new Vector3(1,1,1);
break;
case AffectedAxesAction.XZ:
axis = new Vector3(1,0,1);
break;
case AffectedAxesAction.YZ:
axis = new Vector3(0,1,1);
break;
}
return axis;
}
protected void DoDirectAction(float value){
Vector3 localAxis = GetInfluencedAxis();
switch ( directAction){
// Rotate
case DirectAction.Rotate:
transform.Rotate( localAxis * value, Space.World);
break;
// Rotate Local
case DirectAction.RotateLocal:
transform.Rotate( localAxis * value,Space.Self);
break;
// Translate
case DirectAction.Translate:
if ( directCharacterController==null){
transform.Translate(localAxis * value,Space.World);
}
else{
Vector3 direction = localAxis * value;
directCharacterController.Move( direction );
}
break;
// Translate local
case DirectAction.TranslateLocal:
if ( directCharacterController==null){
transform.Translate(localAxis * value,Space.Self);
}
else{
Vector3 direction = directCharacterController.transform.TransformDirection(localAxis) * value;
directCharacterController.Move( direction );
}
break;
// Scale
case DirectAction.Scale:
transform.localScale += localAxis * value;
break;
/*
// Force
case DirectAction.Force:
if (directRigidBody!=null){
directRigidBody.AddForce( localAxis * axisValue * speed);
}
break;
// Relative force
case DirectAction.RelativeForce:
if (directRigidBody!=null){
directRigidBody.AddRelativeForce( localAxis * axisValue * speed);
}
break;
// Torque
case DirectAction.Torque:
if (directRigidBody!=null){
directRigidBody.AddTorque(localAxis * axisValue * speed);
}
break;
// Relative torque
case DirectAction.RelativeTorque:
if (directRigidBody!=null){
directRigidBody.AddRelativeTorque(localAxis * axisValue * speed);
}
break;*/
}
}
#endregion
#region Public Methods
public void EnabledQuickComponent(string quickActionName){
QuickBase[] quickBases = GetComponents<QuickBase>();
foreach( QuickBase qb in quickBases){
if (qb.quickActionName == quickActionName){
qb.enabled = true;
}
}
}
public void DisabledQuickComponent(string quickActionName){
QuickBase[] quickBases = GetComponents<QuickBase>();
foreach( QuickBase qb in quickBases){
if (qb.quickActionName == quickActionName){
qb.enabled = false;
}
}
}
public void DisabledAllSwipeExcepted(string quickActionName){
QuickSwipe[] swipes = FindObjectsOfType(typeof(QuickSwipe)) as QuickSwipe[];
foreach( QuickSwipe swipe in swipes){
if (swipe.quickActionName != quickActionName || ( swipe.quickActionName == quickActionName && swipe.gameObject != gameObject)){
swipe.enabled = false;
}
}
}
#endregion
}
}
列举 枚举的成员
#region enumeration
protected enum GameObjectType { Auto,Obj_3D,Obj_2D,UI};
public enum DirectAction {None,Rotate, RotateLocal,Translate, TranslateLocal, Scale};
public enum AffectedAxesAction {X,Y,Z,XY,XZ,YZ,XYZ};
#endregion
出了游戏对象, 3D 2D UI
游戏对象的一些操作, 旋转,局部旋转, 位移,局部位移,和大小。
影响操作的轴,X, Y, Z, XY, XZ, YZ, XYZ。 这个主要用来判断 那个轴受影响。
下面是成员
#region Members
public string quickActionName;
// Touch management
public bool isMultiTouch = false;
public bool is2Finger = false;
public bool isOnTouch=false;
public bool enablePickOverUI = false;
public bool resetPhysic = false;
// simple Action
public DirectAction directAction;
public AffectedAxesAction axesAction;
public float sensibility = 1;
public CharacterController directCharacterController;
public bool inverseAxisValue = false;
protected Rigidbody cachedRigidBody;
protected bool isKinematic;
protected Rigidbody2D cachedRigidBody2D;
protected bool isKinematic2D;
// internal management
protected GameObjectType realType;
protected int fingerIndex =-1;
#endregion
public string quickActionName; 每个quickAction的名字 方便查找 管理
bool成员信息
// Touch management
public bool isMultiTouch = false; 是否多触碰
public bool is2Finger = false; 是否 2个手指,
public bool isOnTouch=false; 是否 在 触碰
public bool enablePickOverUI = false; 能不能 穿透UI
public bool resetPhysic = false; 是否 拖拽时 无视 物理信息,刚体组件等等....
简单 的 行为
// simple Action
public DirectAction directAction; 上面声明的枚举的引用 游戏对象的一些操作
public AffectedAxesAction axesAction; 影响操作的轴
public float sensibility = 1; 敏感度
public CharacterController directCharacterController; Unity 自带的角色控制器
public bool inverseAxisValue = false; 是否反转轴的值
protected Rigidbody cachedRigidBody; // 要隐藏的 刚体组件 勾选 resetPhysic才生效
protected bool isKinematic; 是否不受动力学影响
protected Rigidbody2D cachedRigidBody2D;// 要隐藏的 刚体组件 2d, 游戏物体为2d时才使用到
protected bool isKinematic2D;//是否不受动力学影响 2d
内部管理
// internal management
protected GameObjectType realType; 游戏对象类型 3D 2D UI
protected int fingerIndex =-1; 手指下标 默认-1
#endregion
方法 Unity脚本的 回调
#region Monobehavior Callback
void Awake(){
cachedRigidBody = GetComponent<Rigidbody>();
if (cachedRigidBody){
isKinematic = cachedRigidBody.isKinematic;
}
cachedRigidBody2D = GetComponent<Rigidbody2D>();
if (cachedRigidBody2D){
isKinematic2D = cachedRigidBody2D.isKinematic;
}
}
public virtual void Start(){
EasyTouch.SetEnableAutoSelect( true);
realType = GameObjectType.Obj_3D;
if (GetComponent<Collider>()){
realType = GameObjectType.Obj_3D;
}
else if (GetComponent<Collider2D>()){
realType = GameObjectType.Obj_2D;
}
else if (GetComponent<CanvasRenderer>()){
realType = GameObjectType.UI;
}
switch (realType){
case GameObjectType.Obj_3D:
LayerMask mask = EasyTouch.Get3DPickableLayer();
mask = mask | 1<<gameObject.layer;
EasyTouch.Set3DPickableLayer( mask);
break;
//2D
case GameObjectType.Obj_2D:
EasyTouch.SetEnable2DCollider( true);
mask = EasyTouch.Get2DPickableLayer();
mask = mask | 1<<gameObject.layer;
EasyTouch.Set2DPickableLayer( mask);
break;
// UI
case GameObjectType.UI:
EasyTouch.instance.enableUIMode = true;
EasyTouch.SetUICompatibily( false);
break;
}
if (enablePickOverUI){
EasyTouch.instance.enableUIMode = true;
EasyTouch.SetUICompatibily( false);
}
}
public virtual void OnEnable(){
//QuickTouchManager.instance.RegisterQuickAction( this);
}
public virtual void OnDisable(){
//if (QuickTouchManager._instance){
// QuickTouchManager.instance.UnregisterQuickAction( this);
//}
}
#endregion
在Awake的时候 判断游戏对象类型 进行 赋值 主要是 刚体,当然啦如果 身上没加刚体,也不会报错,这里就为null
void Awake(){
cachedRigidBody = GetComponent<Rigidbody>();
if (cachedRigidBody){
isKinematic = cachedRigidBody.isKinematic;
}
cachedRigidBody2D = GetComponent<Rigidbody2D>();
if (cachedRigidBody2D){
isKinematic2D = cachedRigidBody2D.isKinematic;
}
}
把 start 方法 写成 公开 虚方法。方便多态继承;
public virtual void Start(){
EasyTouch.SetEnableAutoSelect( true);
realType = GameObjectType.Obj_3D;
if (GetComponent<Collider>()){
realType = GameObjectType.Obj_3D;
}
else if (GetComponent<Collider2D>()){
realType = GameObjectType.Obj_2D;
}
else if (GetComponent<CanvasRenderer>()){
realType = GameObjectType.UI;
}
switch (realType){
case GameObjectType.Obj_3D:
LayerMask mask = EasyTouch.Get3DPickableLayer();
mask = mask | 1<<gameObject.layer;
EasyTouch.Set3DPickableLayer( mask);
break;
//2D
case GameObjectType.Obj_2D:
EasyTouch.SetEnable2DCollider( true);
mask = EasyTouch.Get2DPickableLayer();
mask = mask | 1<<gameObject.layer;
EasyTouch.Set2DPickableLayer( mask);
break;
// UI
case GameObjectType.UI:
EasyTouch.instance.enableUIMode = true;
EasyTouch.SetUICompatibily( false);
break;
}
if (enablePickOverUI){
EasyTouch.instance.enableUIMode = true;
EasyTouch.SetUICompatibily( false);
}
}
EasyTouch.SetEnableAutoSelect( true); 能够 自动选取为True;
这个是 在EasyTouch里的单例,在内存分配空间。
然后 赋值游戏对象类型, 通过Collider/CanvasRenderer来判断,默认就是3D咯
再通过 Swich 判断 类型 获取到LayerMask,然后 再设置Mask。 mask | 1<<gameObject.layer是左移 一位获取,因为layer 有0~31 共32层,也是32位 二进制位 层级很好用的,可以用来判断 射线,渲染
这里获取到的 默认都是Default层
如果是 UI 把UIMode为true
这个是 获取 axis 根据前面的 public enum AffectedAxesAction {X,Y,Z,XY,XZ,YZ,XYZ}; 来 设置
DoDirectAction(float value) 是根据directAction与前面的受影响的Axis 来计算的,有 旋转,局部旋转, 位移,局部位移,和大小。
protected void DoDirectAction(float value){
Vector3 localAxis = GetInfluencedAxis();
switch ( directAction){
// Rotate
case DirectAction.Rotate:
transform.Rotate( localAxis * value, Space.World);
break;
// Rotate Local
case DirectAction.RotateLocal:
transform.Rotate( localAxis * value,Space.Self);
break;
// Translate
case DirectAction.Translate:
if ( directCharacterController==null){
transform.Translate(localAxis * value,Space.World);
}
else{
Vector3 direction = localAxis * value;
directCharacterController.Move( direction );
}
break;
// Translate local
case DirectAction.TranslateLocal:
if ( directCharacterController==null){
transform.Translate(localAxis * value,Space.Self);
}
else{
Vector3 direction = directCharacterController.transform.TransformDirection(localAxis) * value;
directCharacterController.Move( direction );
}
break;
// Scale
case DirectAction.Scale:
transform.localScale += localAxis * value;
break;
/*
// Force
case DirectAction.Force:
if (directRigidBody!=null){
directRigidBody.AddForce( localAxis * axisValue * speed);
}
break;
// Relative force
case DirectAction.RelativeForce:
if (directRigidBody!=null){
directRigidBody.AddRelativeForce( localAxis * axisValue * speed);
}
break;
// Torque
case DirectAction.Torque:
if (directRigidBody!=null){
directRigidBody.AddTorque(localAxis * axisValue * speed);
}
break;
// Relative torque
case DirectAction.RelativeTorque:
if (directRigidBody!=null){
directRigidBody.AddRelativeTorque(localAxis * axisValue * speed);
}
break;*/
}
}
还有几个公开的 方法
#region Public Methods
public void EnabledQuickComponent(string quickActionName){
QuickBase[] quickBases = GetComponents<QuickBase>();
foreach( QuickBase qb in quickBases){
if (qb.quickActionName == quickActionName){
qb.enabled = true;
}
}
}
public void DisabledQuickComponent(string quickActionName){
QuickBase[] quickBases = GetComponents<QuickBase>();
foreach( QuickBase qb in quickBases){
if (qb.quickActionName == quickActionName){
qb.enabled = false;
}
}
}
public void DisabledAllSwipeExcepted(string quickActionName){
QuickSwipe[] swipes = FindObjectsOfType(typeof(QuickSwipe)) as QuickSwipe[];
foreach( QuickSwipe swipe in swipes){
if (swipe.quickActionName != quickActionName || ( swipe.quickActionName == quickActionName && swipe.gameObject != gameObject)){
swipe.enabled = false;
}
}
}
#endregion
EnabledQuickComponent(string quickActionName) 是启用 不同类型的事件 ,QuickDrag.....
根据 前面 声明 的 public string quickActionName; 查找、然后启用
public void EnabledQuickComponent(string quickActionName){
QuickBase[] quickBases = GetComponents<QuickBase>();
foreach( QuickBase qb in quickBases){
if (qb.quickActionName == quickActionName){
qb.enabled = true;
}
}
}
DisabledQuickComponent(string quickActionName) 和前面的一样,只不过是禁用
public void DisabledQuickComponent(string quickActionName){
QuickBase[] quickBases = GetComponents<QuickBase>();
foreach( QuickBase qb in quickBases){
if (qb.quickActionName == quickActionName){
qb.enabled = false;
}
}
}
DisabledAllSwipeExcepted(string quickActionName) 这个 是 除了传进来的事件,其他的Swip类都禁用
public void DisabledAllSwipeExcepted(string quickActionName){
QuickSwipe[] swipes = FindObjectsOfType(typeof(QuickSwipe)) as QuickSwipe[];
foreach( QuickSwipe swipe in swipes){
if (swipe.quickActionName != quickActionName || ( swipe.quickActionName == quickActionName && swipe.gameObject != gameObject)){
swipe.enabled = false;
}
}
}
QuickBase 类是 所有Quick子类的父类。 抽象 类。