wangguan
2020-12-29 452c75675679c44cc39b04bdb7d330d7c5c14d5c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
namespace MoreMountains.NiceVibrations
{
    public class BallTouchZone : MonoBehaviour, IPointerExitHandler, IPointerEnterHandler
    {
        public RenderMode ParentCanvasRenderMode { get; protected set; }
        public RectTransform BallMover;
        protected bool _holding = false;
        protected PointerEventData _pointerEventData;
        protected Vector3 _newPosition;
        protected Canvas _canvas;
        protected float _initialZPosition;
        protected Vector2 _workPosition;
 
 
        protected virtual void Start()
        {
            Initialization();
        }
 
        protected virtual void Initialization()
        {
            ParentCanvasRenderMode = GetComponentInParent<Canvas>().renderMode;
            _canvas = GetComponentInParent<Canvas>();
            _initialZPosition = transform.position.z;
        }
 
        protected virtual void Update()
        {
            if (_holding)
            {
                _newPosition = GetWorldPosition(_pointerEventData.position);
            }
            else
            {
                _newPosition = Vector3.one * 5000f;
            }
 
            _newPosition.z = _initialZPosition;
            BallMover.position = _newPosition;
        }
        protected virtual Vector3 GetWorldPosition(Vector3 testPosition)
        {
            if (ParentCanvasRenderMode == RenderMode.ScreenSpaceCamera)
            {
                RectTransformUtility.ScreenPointToLocalPointInRectangle(_canvas.transform as RectTransform, testPosition, _canvas.worldCamera, out _workPosition);
                return _canvas.transform.TransformPoint(_workPosition);
            }
            else
            {
                return testPosition;
            }
        }
 
        public virtual void OnPointerEnter(PointerEventData data)
        {
            _holding = true;
            _pointerEventData = data;
        }
 
        public virtual void OnPointerExit(PointerEventData data)
        {
            _holding = false;
        }
 
    }
}