package
{
[Doc]
/**
* ...
* @author
*/
public class Main
{
public function Main()
{
}
public function update():void
{
}
}
}
import as3runtime.RefOutStore;
import system.collections.generic.List_Of_EventTrigger_Entry;
import unityengine.GameObject;
import unityengine.MonoBehaviour;
import unityengine.RectTransform;
import unityengine.RectTransformUtility;
import unityengine.Vector3;
import unityengine.events.UnityAction_Of_BaseEventData;
import unityengine.eventsystems.BaseEventData;
import unityengine.eventsystems.EventTrigger;
import unityengine.eventsystems.EventTriggerType;
import unityengine.eventsystems.EventTrigger_Entry;
import unityengine.eventsystems.PointerEventData;
class UGUIEventTriggerTool
{
/**
* 静态方法。检查某个GameObject上是否包含EventTrigger组件。如果有则返回它,否则创建一个并返回。
* @param go 输入的GameObject
* @return 返回EventTrigger
*/
public static function Get(go:GameObject):EventTrigger
{
var trigger:EventTrigger = go.getComponent(EventTrigger) as EventTrigger;
if (null == trigger)
{
trigger = EventTrigger(go.addComponent(EventTrigger));
}
return trigger;
}
}
/* *
* 在EventTrigger的原型链上定义AddEventListener方法。
* EventTrigger类型没有公开构造函数,因此API导出时,不会为他创建在脚本中继承的接口。
* 这里我们可以用原型链来对它进行扩展。
* 包外代码只会执行一次。所以只会在原型链上定义一次AddEventListener方法。
* */
EventTrigger.prototype.AddEventListener =
function (eventTriggerType:EventTriggerType, action:UnityAction_Of_BaseEventData):void
{
/**
* EventTrigger有一个嵌套内部类 UnityEngine.EventSystems.EventTrigger.Entry。
* 由于ActionScript3并不支持嵌套类,因此它被导出成为EventTrigger_Entry。
*/
var entry:EventTrigger_Entry = new EventTrigger_Entry();
entry.eventID = eventTriggerType;
entry.callback.addListener(action);
this.triggers.add(entry);
}
/**
* 扩展MonoBehaviour,让Image组件可以被拖拽。
*/
class UGUIEventTriggerTest extends MonoBehaviour
{
function Start()
{
/**
* 此处使用 * 类型来代表任意类型。
* 这样即可跳过编译时类型检查,使用原型链。
* 否则将会提示编译错误。
*/
var t:* = UGUIEventTriggerTool.Get(gameObject);
/**
* 调用在原型链上定义的方法,给Drag事件添加处理函数。
* 我们可以直接使用匿名函数来作为处理函数。
*/
t.AddEventListener(EventTriggerType.Drag,
function (baseData:BaseEventData):void
{
var data:PointerEventData = baseData as PointerEventData;
var rt:RectTransform = data.pointerPress.getComponent(RectTransform) as RectTransform;
var globalMousePos:Vector3;
/**
* RectTransformUtility.screenPointToWorldPointInRectangle的参数
* worldPoint : (Out)UnityEngine.Vector3
* 是一个Ref Out参数。ActionScript3是没有ref和out关键字的,
* 因此这里使用RefOutStore来接收返回的参数。
*/
var store:RefOutStore = new RefOutStore();
if (RectTransformUtility.screenPointToWorldPointInRectangle(rt, data.position, data.pressEventCamera, globalMousePos,store))
{
//传入形参名,来提取值。
globalMousePos = store.getValue("worldPoint") as Vector3;
rt.position = globalMousePos;
}
}
);
}
}
//将脚本挂载到Image上。
GameObject.find("Image").addComponent(UGUIEventTriggerTest);