EasyTouch学习之QuickBase

本文深入解析了QuickBase类的功能及其实现细节,该类作为触摸交互的基础类,提供了丰富的属性和方法来支持不同类型的触控行为。介绍了QuickBase类如何初始化、识别不同类型的游戏对象,并详细解释了其核心方法DoDirectAction的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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子类的父类。 抽象 类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值