Unity 物体拖动

1.简单托动代码,必须要第一个摄像机深度值比较高照射要拖动的物体,使其实时在物体前面,代码如下

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using System.Collections.Generic;
using DG.Tweening;
public class CarDrag : MonoBehaviour , IBeginDragHandler, IDragHandler, IEndDragHandler ,IPointerDownHandler ,IPointerUpHandler
{
    private float offset;
    private Vector3 m_distance;
    private Vector3 m_origin;
    private UnityAction m_action;
    private Vector3 m_orignScale;
    private bool m_isCanClick;

    public GameObject m_effect;
    public void OnInitial(UnityAction m_action)
    {
        this.m_action = m_action;
    }

    private void Awake()
    {
        m_isCanClick = true;
        m_orignScale = transform.localScale;
    }


    public void OnPointerDown(PointerEventData eventData)
    {
        transform.DOScale(m_orignScale * 1.2f,0.2f);
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        transform.DOScale(m_orignScale, 0.2F);
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        if (!m_isCanClick)
            return;
        transform.localScale = m_orignScale * 1.2f;
        transform.SetChildrenLayer(transform,LayerMask.NameToLayer("DefaultAdd"));
        offset = Camera.main.WorldToScreenPoint(transform.position).z;
        m_distance = -Camera.main.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, offset)) + transform.position;
    }

    public void OnDrag(PointerEventData eventData)
    {
        if (!m_isCanClick)
            return;
        transform.position = Camera.main.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, offset)) + m_distance;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        if (!m_isCanClick)
            return;
        List<RaycastResult> m_rayArray = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventData, m_rayArray);
        //var o = m_rayArray.Find(x => x.gameObject.GetComponent<MeshRenderer>().enabled == false);
        foreach(var s in m_rayArray)
        {
            //Debug.LogError(s.gameObject.name + "    "+ s.gameObject.tag);
        }
        var o = m_rayArray.Find(x => x.gameObject.tag == "road");
        if (o.gameObject != null)
        {
            if (GetComponent<NumTags>().m_tagNum == o.gameObject.GetComponent<NumTags>().m_tagNum)
            {
                transform.DOMove(o.gameObject.transform.position, 0.4F).OnComplete(
                    () => {
                        m_effect.SetActive(true); m_action.Invoke();
                        GetComponent<Animator>().enabled = true;
                        transform.SetChildrenLayer(transform, LayerMask.NameToLayer("Default"));
                    });
                GetComponent<SphereCollider>().enabled = false;
            }
            else
            {
                m_isCanClick = false;
                transform.DOLocalMove(Vector3.zero, 0.8f).OnComplete(() => { transform.SetChildrenLayer(transform, LayerMask.NameToLayer("Default"));
                    m_isCanClick = true;
                }); 
            }
        }
        else
        {
            m_isCanClick = false;
            transform.DOLocalMove(Vector3.zero, 0.8f).OnComplete(() =>
            {
                transform.SetChildrenLayer(transform, LayerMask.NameToLayer("Default"));
                m_isCanClick = true;
            });
        }
        transform.DOScale(m_orignScale, 0.4f);
    }
}

2.设置层为XX层里面的扩展类:

using UnityEngine;
using System.Collections.Generic;
using System;


    public static class TransformExtension
    {
        public static int GetActiveChildCount(this Transform transform)
        {
            int count = 0;
            foreach (Transform child in transform)
            {
                if (child.gameObject.activeSelf)
                    count++;
            }

            return count;
        }

        public static T[] GetComponentsInFirstHierarchyChildren<T>(this Transform transform, bool includeInactive = true) where T : Component
        {
            List<T> components = new List<T>();
            foreach (Transform child in transform)
            {
                if (!includeInactive && !child.gameObject.activeSelf)
                    continue;

                T component = child.GetComponent<T>();
                if (component != null)
                    components.Add(component);
            }

            return components.ToArray();
        }

        public static void SetX(this Transform transform, float x)
        {
            Vector3 newPosition = new Vector3(x, transform.position.y, transform.position.z);

            transform.position = newPosition;
        }

        public static void SetY(this Transform transform, float y)
        {
            Vector3 newPosition = new Vector3(transform.position.x, y, transform.position.z);

            transform.position = newPosition;
        }

        public static void SetZ(this Transform transform, float z)
        {
            Vector3 newPosition = new Vector3(transform.position.x, transform.position.y, z);

            transform.position = newPosition;
        }

        public static void SetXY(this Transform transform, Vector3 position)
        {
            transform.position = new Vector3(position.x, position.y, transform.position.z);
        }

        public static void SetXZ(this Transform transform, Vector3 position)
        {
            transform.position = new Vector3(position.x, transform.position.y, position.z);
        }

        public static void SetLocalX(this Transform transform, float x)
        {
            Vector3 newPosition = new Vector3(x, transform.localPosition.y, transform.localPosition.z);

            transform.localPosition = newPosition;
        }

        public static void SetLocalY(this Transform transform, float y)
        {
            Vector3 newPosition = new Vector3(transform.localPosition.x, y, transform.localPosition.z);

            transform.localPosition = newPosition;
        }

        public static void SetLocalZ(this Transform transform, float z)
        {
            Vector3 newPosition = new Vector3(transform.localPosition.x, transform.localPosition.y, z);

            transform.localPosition = newPosition;
        }

        public static void SetLocalAngleX(this Transform transform, float x)
        {
            transform.localEulerAngles = new Vector3(x, transform.localEulerAngles.y, transform.localEulerAngles.z);
        }

        public static void SetLocalAngleY(this Transform transform, float y)
        {
            transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, y, transform.localEulerAngles.z);
        }

        public static void SetLocalAngleZ(this Transform transform, float z)
        {
            transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, z);
        }

        public static string GetPath(this Transform transform)
        {
            string path = transform.name;

            while (transform.parent != null)
            {
                transform = transform.parent;
                path = transform.name + "/" + path;
            }

            return path;
        }

        public static int IndexInParent(this Transform transform)
        {
            if (transform.parent == null)
                return -1;

            for (int i = 0; i < transform.parent.childCount; i++)
            {
                if (transform.parent.GetChild(i) == transform)
                    return i;
            }

            return -1;
        }

        public static void SetActiveInChildren(this Transform transform, bool value)
        {
            for (int i = 0; i < transform.childCount; i++)
            {
                transform.GetChild(i).gameObject.SetActive(value);
            }
        }

        public static void SetLocalScaleX(this Transform transform, float x)
        {
            Vector3 newScale = new Vector3(x, transform.localScale.y, transform.localScale.z);
            transform.localScale = newScale;
        }
        public static void SetLocalScaleY(this Transform transform, float y)
        {
            Vector3 newScale = new Vector3(transform.localScale.x, y, transform.localScale.z);
            transform.localScale = newScale;
        }
        public static void SetLocalScaleZ(this Transform transform, float z)
        {
            Vector3 newScale = new Vector3(transform.localScale.x, transform.localScale.y, z);
            transform.localScale = newScale;
        }

        public static bool EqualsInHierarchy(this Transform transform, Transform other)
        {
            if (transform.childCount != other.childCount)
                return false;

            for (int i = 0; i < transform.childCount; i++)
            {
                if (transform.GetChild(i).name != other.GetChild(i).name)
                    return false;
                else if (!EqualsInHierarchy(transform.GetChild(i), other.GetChild(i)))
                    return false;
            }

            return true;
        }

        public static void DestroyChildren(this Transform transform)
        {
            for (int i = 0; i < transform.childCount; i++)
                UnityEngine.Object.Destroy(transform.GetChild(i).gameObject);
        }

        public static T GetComponentInChildrenWithName<T>(this Transform transform, string name) where T : Component
        {
            var array = transform.GetComponentsInChildren<T>();
            return Array.Find(array, (item) =>
            {
                return item.name == name;
            });
        }

        public static void SetChildrenLayer(this Transform transform, Transform transforms, LayerMask layer)
        {
            foreach (Transform childTransform in transform)
            {
                childTransform.gameObject.layer = layer;
                childTransform.SetChildrenLayer(childTransform, layer);
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值