Advertisement
KpoKec

Create line on sphere (LineRenderer)

Feb 21st, 2017
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.20 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5.  
  6. public class InputController : MonoBehaviour
  7. {
  8.    
  9.     private Vector3 point1;
  10.     private Vector3 point2;
  11.     private bool click1 = false;
  12.     private bool click2 = false;
  13.     public LineRenderer line; // в инспекторе задаём LineRenderer
  14.     public Transform go; // в инспекторе задаём сферу
  15.     [Range(2,50)]
  16.     [Header("Количество сегментов линии")]
  17.     public int segments = 10;
  18.     [Space(10)]
  19.     public float sphereRadius = 1;
  20.     private LayerMask _lm;
  21.  
  22.     public float sens = 2.0f; // сенс вращения камеры
  23.     public float moveSpeed = 0.1f; // скорость движения камеры
  24.     public float verticalSpeed = 0.05f; // скорость подъема камеры (Space/Ctrl)
  25.     public float rotateSens = 3.0f; // сенс вращения сферы
  26.  
  27.     // Use this for initialization
  28.     void Start()
  29.     {
  30.         line.enabled = false; // выключаем линию
  31.         _lm = LayerMask.GetMask("sphere"); // сохраняем маску для сферы
  32.         TextManager.Instance.LoadLocalizationAsset("russian.txt", LoadDone);
  33.     }
  34.  
  35.     private void LoadDone()
  36.     {
  37.         print("Localization loaded");
  38.         TextManager.Instance.ReplaceAllText();
  39.     }
  40.     // Update is called once per frame
  41.     void Update()
  42.     {
  43.         // здесь блок перемещения камеры WSAD + Space/Ctrl
  44.         float forwardMove = Input.GetAxis("Vertical") * moveSpeed;
  45.         float sideMove = Input.GetAxis("Horizontal") * moveSpeed;
  46.         float verticalMove = Input.GetAxis("Jump") * verticalSpeed;
  47.         Camera.main.transform.position += Camera.main.transform.forward * forwardMove +
  48.                                           Camera.main.transform.right * sideMove +
  49.                                           Camera.main.transform.up * verticalMove;
  50.         // ПКМ - вращение камеры
  51.         if (Input.GetMouseButton(1))
  52.         {
  53.             float mouseX = Input.GetAxis("Mouse X") * sens;
  54.             float mouseY = Input.GetAxis("Mouse Y") * sens;
  55.             Camera.main.transform.Rotate(Vector3.up, mouseX, Space.World);
  56.             Camera.main.transform.Rotate(Vector3.right, -mouseY, Space.Self);
  57.         }
  58.         // СКМ - вращение сферы
  59.         if (Input.GetMouseButton(2))
  60.         {
  61.             float mouseX = Input.GetAxis("Mouse X") * rotateSens;
  62.             float mouseY = Input.GetAxis("Mouse Y") * rotateSens;
  63.             go.rotation *= Quaternion.Euler(go.InverseTransformDirection(mouseY, -mouseX, 0f));
  64.         }
  65.         //ЛКМ - ставим точки на сфере
  66.         if (Input.GetMouseButtonUp(0))
  67.         {
  68.             if (!click1) // если ни одной точки нет
  69.             {
  70.                 RaycastHit rh;
  71.                 if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out rh, _lm))
  72.                 {
  73.                     click1 = true;
  74.                     point1 = (rh.point);
  75.                     line.enabled = false;
  76.                     return;
  77.                 }
  78.             }
  79.  
  80.             if (click1 && !click2) // если первая точка есть, а второй нет
  81.             {
  82.                 RaycastHit rh;
  83.                 if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out rh, _lm))
  84.                 {
  85.                     click2 = true;
  86.                     point2 = (rh.point);
  87.                     DrawLine();
  88.                     return;
  89.                 }
  90.             }
  91.  
  92.             if (click1 && click2) // если обе точки есть
  93.             {
  94.                 RaycastHit rh;
  95.                 if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out rh, _lm))
  96.                 {
  97.                     click2 = false;
  98.                     point1 = (rh.point);
  99.                     line.enabled = false;
  100.                     return;
  101.                 }
  102.             }
  103.         }
  104.     }
  105.  
  106.     private void DrawLine()
  107.     {
  108.         line.numPositions = segments; // задаём количество сегментов
  109.         for (int i=0; i<=segments-1; i++) // проходим по всем сегментам
  110.         {
  111.             Vector3 t = go.InverseTransformPoint( //преобразуем в локальные координаты
  112.                 (Vector3.Lerp(point1 - go.position, // точка-1 относительно центра
  113.                               point2 - go.position, // точка-2 относительно центра
  114.                               (i / (float)segments) // шаг лерпа относительно номера сегмента
  115.                               ).normalized * (sphereRadius + 0.01f)) // нормализуем и умножаем на размер сферы
  116.                               + go.position // смещаем в центр сферы
  117.                 );
  118.             line.SetPosition(i, t); // задаём позицию сегмента
  119.         }
  120.         line.enabled = true; // включаем линию
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement