Как сделать Touch Control как мини-гольф King - PullRequest
0 голосов
/ 01 ноября 2018

Цель

Привет, ребята! Я новичок с единством 3-D. Я хочу сделать элементы управления в точности как Mini Golf King. Например, когда шар останавливается, указатели становятся видимыми на экране. При нажатии на указатель и перетаскивании его масштаб изменяется и всегда указывает на шар.

Это то, чего я хочу достичь

This is what I want to achieve

МОЙ Подход

Изначально, согласно моим знаниям, я что-то реализовал с использованием лучевого приведения. В указатель я поместил трехмерный указатель как дочерний объект шара. когда я касаюсь экрана, я отправляю луч света в мир с экрана, который обнаруживает мяч, если я касаюсь шара, я показываю указатель, и в каждой точке экрана я постоянно посылаю лучи на мир и соответственно изменяю направление указателя, но я думаю, что это не очень хорошо с точки зрения производительности

 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

            }

    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...