NGUIJoysticK

原始的:

using UnityEngine;
using System.Collections;

public class NGUIJoystick : MonoBehaviour
{
    public float radius = 2.0f;
    public Vector3 scale = Vector3.one;
    private Plane mPlane;
    private Vector3 mLastPos;
    private UIPanel mPanel;
    private Vector3 center;
    [HideInInspector]
    public Vector2 position;
    
    private void Start ()
    {
        center = transform.localPosition;
    }
    
    /// <summary>
    /// Create a plane on which we will be performing the dragging.
    /// </summary>
    
    private void OnPress (bool pressed)
    {
        if (enabled && gameObject.activeInHierarchy) {
            if (pressed) {
                mLastPos = UICamera.lastHit.point;
                mPlane = new Plane (Vector3.back, mLastPos);
            } else {
                transform.localPosition = center;
                position=Vector2.zero;
            }
        }
    }

    /// <summary>
    /// Drag the object along the plane.
    /// </summary>

    void OnDrag (Vector2 delta)
    {
        if (enabled && gameObject.activeInHierarchy) {
            UICamera.currentTouch.clickNotification = UICamera.ClickNotification.BasedOnDelta;

            Ray ray = UICamera.currentCamera.ScreenPointToRay (UICamera.currentTouch.pos);
            float dist = 0f;

            if (mPlane.Raycast (ray, out dist)) {
                Vector3 currentPos = ray.GetPoint (dist);
                Vector3 offset = currentPos - mLastPos;
                mLastPos = currentPos;

                if (offset.x != 0f || offset.y != 0f) {
                    offset = transform.InverseTransformDirection (offset);
                    offset.Scale (scale);
                    offset = transform.TransformDirection (offset);
                }
                
                offset.z = 0;
                transform.position += offset;
                
                float length = transform.localPosition.magnitude;
                 
                if (length > radius) {
                    transform.localPosition = Vector3.ClampMagnitude (transform.localPosition, radius);
                }

                position = new Vector2((transform.localPosition.x-center.x)/radius,(transform.localPosition.y-center.y)/radius);
            }
        }
    }
    
}

 

超凡特工的:

using System;
using UnityEngine;

public class NGUIJoystick : MonoBehaviour
{
    public bool activeFlag;
    public Vector3 center;
    private float deadRadius;
    public float deadRadiusRatio = 0.3f;
    public bool lastPressed;
    protected UIPanel mPanel;
    protected Plane mPlane;
    public Vector2 normalizedPosition;
    public float normalizedRadius = 2f;
    public Vector2 position;
    public float radius = 2f;
    public Vector3 worldCenter;

    internal void Move(Vector3 offset)
    {
        offset.z = 0f;
        base.transform.position = this.worldCenter + offset;
        float magnitude = base.transform.localPosition.magnitude;
        if (magnitude < this.deadRadius)
        {
            this.normalizedPosition = Vector2.zero;
        }
        else
        {
            if (magnitude > this.radius)
            {
                base.transform.localPosition = Vector3.ClampMagnitude(base.transform.localPosition, this.radius);
            }
            float num2 = base.transform.localPosition.x - this.center.x;
            float num3 = base.transform.localPosition.y - this.center.y;
            this.position.x = num2 / this.radius;
            this.position.y = num3 / this.radius;
            this.normalizedPosition.x = num2 / this.normalizedRadius;
            this.normalizedPosition.y = num3 / this.normalizedRadius;
            this.normalizedPosition.x = Mathf.Clamp(this.normalizedPosition.x, -1f, 1f);
            this.normalizedPosition.y = Mathf.Clamp(this.normalizedPosition.y, -1f, 1f);
        }
    }

    internal virtual void OnDrag(Vector2 delta)
    {
        if (base.enabled && base.gameObject.activeInHierarchy)
        {
            Ray ray = UICamera.currentCamera.ScreenPointToRay((Vector3) UICamera.currentTouch.pos);
            float enter = 0f;
            if (this.mPlane.Raycast(ray, out enter))
            {
                Vector3 offset = ray.GetPoint(enter) - this.worldCenter;
                this.Move(offset);
            }
        }
    }

    internal virtual void OnPress(bool pressed)
    {
        if (base.enabled && base.gameObject.activeInHierarchy)
        {
            if (pressed)
            {
                this.mPlane = new Plane(Vector3.back, UICamera.lastHit.point);
            }
            else
            {
                base.transform.localPosition = this.center;
                this.position = Vector2.zero;
                this.activeFlag = true;
            }
            this.lastPressed = pressed;
        }
    }

    public void SetRadius(float r, float nr)
    {
        this.radius = r;
        this.normalizedRadius = nr;
        this.deadRadius = this.radius * this.deadRadiusRatio;
    }

    internal virtual void Start()
    {
        this.center = base.transform.localPosition;
        this.worldCenter = base.transform.position;
    }
}

 

namespace Kola
{
    using LuaInterface;
    using System;
    using UnityEngine;

    public class KJoystick : NGUIJoystick
    {
        public UIRect bgObject;
        public bool FollowPressPosition;
        private Vector3 originPos;
        private Transform parent;
        public LuaTable playerControl;
        public LuaFunction playerControlSetInputFunc;
        public KMoveBehavior playerMove;
        public float pressAlpha = 0.5f;

        private void _OnDrag(GameObject go, Vector2 delta)
        {
            this.OnDrag(delta);
        }

        private void _OnPress(GameObject go, bool pressed)
        {
            this.OnPress(pressed);
            if (pressed)
            {
                Vector3 point = UICamera.lastHit.point;
                if (this.FollowPressPosition)
                {
                    this.parent.position = point;
                }
                else
                {
                    Vector3 position = this.parent.position;
                    Vector3 offset = point - position;
                    base.Move(offset);
                    this.OnDrag(Vector2.zero);
                }
                if (this.bgObject != null)
                {
                    this.bgObject.alpha = this.pressAlpha;
                }
            }
            else
            {
                if (this.playerMove != null)
                {
                    this.playerMove.Stand();
                }
                if (this.bgObject != null)
                {
                    this.bgObject.alpha = 1f;
                }
                if (this.playerControlSetInputFunc != null)
                {
                    object[] args = new object[] { this.playerControl, 0f, 0f, true };
                    KLuaFunc.Call(this.playerControlSetInputFunc, args);
                }
                if (this.FollowPressPosition)
                {
                    this.parent.position = this.originPos;
                }
            }
        }

        public void Attach(GameObject draggedObj, GameObject bgObj)
        {
            UIEventListener listener1 = UIEventListener.Get(draggedObj);
            listener1.onPress = (UIEventListener.BoolDelegate) Delegate.Combine(listener1.onPress, new UIEventListener.BoolDelegate(this._OnPress));
            UIEventListener listener2 = UIEventListener.Get(draggedObj);
            listener2.onDrag = (UIEventListener.VectorDelegate) Delegate.Combine(listener2.onDrag, new UIEventListener.VectorDelegate(this._OnDrag));
            this.bgObject = (bgObj != null) ? bgObj.GetComponent<UIRect>() : null;
        }

        private void OnDisable()
        {
            this._OnPress(base.gameObject, false);
        }

        internal override void OnDrag(Vector2 delta)
        {
            base.OnDrag(delta);
            if ((this.playerMove != null) && (base.enabled && base.gameObject.activeInHierarchy))
            {
                if (this.playerControlSetInputFunc != null)
                {
                    object[] args = new object[] { this.playerControl, this.normalizedPosition.x, this.normalizedPosition.y, false };
                    KLuaFunc.Call(this.playerControlSetInputFunc, args);
                }
                else
                {
                    this.playerMove.Move(this.normalizedPosition.x, this.normalizedPosition.y);
                }
            }
        }

        public void OnDrawGizmos()
        {
            Gizmos.color = Color.green;
            Vector3 to = base.transform.position + ((Vector3) (new Vector3(this.position.x, this.position.y, 0f) * 100f));
            Gizmos.DrawLine(base.transform.position, to);
        }

        public void SetPlayer(GameObject obj)
        {
            this.playerMove = obj.GetComponent<KMoveBehavior>();
        }

        public void SetPlayerControl(LuaTable control)
        {
            this.playerControl = control;
            this.playerControlSetInputFunc = KLuaBehavior.GetFunction(control, "SetJoyStickInput");
        }

        internal override void Start()
        {
            base.Start();
            this.parent = base.transform.parent;
            this.originPos = this.parent.position;
        }
    }
}

 

posted @ 2014-10-31 20:17  ing...  阅读(533)  评论(0编辑  收藏  举报