如何制作迷你高尔夫球王之类的触摸控件

时间:2018-11-01 05:16:49

标签: unity3d

目标

大家好!我是统一3-D的新手。我想使控件完全像Mini Golf king。就像当球停下时,指针在屏幕上变得可见。在单击该指针并拖动其比例时,更改会始终指向球。

这是我要实现的目标

This is what I want to achieve

我的方法

根据我的知识,最初我已经使用射线投射实现了某些东西。在指针中,我放置了3-d指针作为ball的子对象。当我触摸屏幕时,我会从屏幕上检测到“球”时向屏幕发送光线投射到世界,如果我触摸“球”,则我会显示“指针”,并且在屏幕上的每个点上,我都会不断向世界发送光线,并相应地更改指针方向,但是我认为这不是提高性能的好方法

 RaycastHit GenerateRayCast(Vector2 position, Camera camera,LayerMask mask) { // GENERATE RAY CAST AT GIVEN DIRECTION IN 3D WORLD
    RaycastHit hito;
    Ray  ray = camera.ScreenPointToRay(position);
    Physics.Raycast(ray, out hito, rayLength, mask);

    return hito;

}

#endregion

#region Updatemethod
void FixedUpdate () {


    if (IsBallInStopPos) {  // IF BALL IN STATIC POSITOIN THEN LISTEN FOR TOUCH INPUTS

        //if (Input.GetMouseButton(0) && !EventSystem.current.IsPointerOverGameObject())
        if (Input.touchCount > 0  && !EventSystem.current.IsPointerOverGameObject()) // CHECK FOR SREEN TOUCH
        {


            touchInput = Input.touches[0];
            // touchInput = Input.mousePosition; // get touch information 

            hitObject = GenerateRayCast(touchInput.position, Camera.main, mask);


            if (touchInput.phase == TouchPhase.Began)
            {

                if (hitObject.collider.name == "Pointer") {  // IF TOUCHED ON POINTER : 
                  if (touchPointSet == false) {

                        touchPointSet = true;
                        touchStartPoint = hitObject.point;  // SETTING START TOUCH POINT
                    }



                }
            }
            else if (touchInput.phase == TouchPhase.Moved) {

               newScale= Mathf.Clamp (Vector3.Distance(pointerChild.transform.position , hitObject.point),1f,2f);

                pointerPivot.transform.localScale = Vector3.one * newScale;// SETTING SCALE ACCORDING TO DRAG VALUE

                if (touchPointSet == true) { // WHEN TOUCH DRAGGED AND PREVIOULY POINTER IS TOUCHED ROTATE THE POINTER AT GIVEN DIRECTION


                    newDirection = new Vector3(hitObject.point.x, transform.position.y, hitObject.point.z);
                    transform.LookAt(2 * transform.position - newDirection);
                    canShoot = true;

                }

            }


        }
        else if (touchInput.phase == TouchPhase.Ended)
        {
            if (newScale <= 1f)
                return;


            if (IsBallInStopPos  && canShoot )
                {

                //shooted = true;
                newScale =  newScale -1;// AS SCALE VALUE IS BETWEEN 1 AND 2 SO SUBSTACT FROM  TO MAKE IT BETWEEN  


                pointerPivot.gameObject.SetActive(false);
                rigidBody.constraints = RigidbodyConstraints.None;
                GetComponent<Rigidbody>().AddRelativeForce(new Vector3(0f, 0f, 10000f * newScale));

                // Time.timeScale = 2f;

                canShoot = false;
                IsBallInStopPos = false;  // AFTER SHOOT : after the ball is shooted now the ball is not in staticstatic condition

            }

    }
 }

0 个答案:

没有答案