Развитие игровой вспышки
Текущее время: Вс сен 23, 2018 5:37 am

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 101 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11
Автор Сообщение
 Заголовок сообщения: Re: [Unity] Общие вопросы/ответы
СообщениеДобавлено: Ср июн 06, 2018 3:28 pm 
Не в сети

Зарегистрирован: Сб мар 11, 2017 12:57 am
Сообщений: 21
День добрый. Столкнулся с задачей, которая менее тривиальна (для меня, по крайней мере), чем кажется на первый взгляд.
Суть
Делаю 2д физический пазл. Идея в том, чтоб нарисовать на экране несколько линий, потом включить гравитацию, под воздействием которой мячик-герой начнет падать/катиться по линиям и взаимодействовать с объектами, которых касается. Нужно доставить таким непрямым способом мяч до точки-финиша. Похоже на Incredible Machine.
Загвоздка
Основу рисования линий я написал. Использую LineRenderer и много BoxCollider2D. Но надо сделать, чтоб линия не рисовалась по объектам (мячу и препятствиям). Как на рисунке.
Изображение
Не могу понять, как это правильно сделать. Тут надо учесть, что LineCollider состоит из отрезков и нельзя чтоб удалялся весь отрезок пересекающий наш объект, иначе в линии будет больше разрыв, чем надо. Пожалуйста помогите.
Также выкладываю свой код:
Код:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class DrawLine : MonoBehaviour
{
     private LineRenderer line;
     private bool isMousePressed;
     public bool isLeftMousePressed = false;
     
     public List<Vector3> pointsList;
     
     private Vector3 mousePos;
     public float width = 0.05f;

     // Structure for line points
     struct myLine
     {
         public Vector3 StartPoint;
         public Vector3 EndPoint;
     };
     //    -----------------------------------   
     void Awake()
     {
         // Create line renderer component and set its property
         line = gameObject.AddComponent<LineRenderer>();
         line.material = (Material)Resources.Load("Materials/LineMat");
         
         line.startWidth = width;
         line.endWidth = width;
       
         line.useWorldSpace = true;
         isMousePressed = false;
         pointsList = new List<Vector3>();
         
     }
     //    -----------------------------------   
     void Update()
     {
         if (Input.GetMouseButtonDown(1))
         {
            isLeftMousePressed = true;
         }

         if (isLeftMousePressed||Game.currentLevel == 0) return;

         if (Input.GetMouseButton(0))
         {
             isMousePressed = true;
         }
         
         // Drawing line when mouse is moving(pressed)
         if (isMousePressed)
         {
             if (Input.GetMouseButtonUp(0))
             {
                 isMousePressed = false;

                 GameObject curve = (GameObject)Instantiate(Resources.Load("Curve"), transform.parent);
                 curve.GetComponent<DrawLine>().width = width;

                 if (line.GetPosition(line.positionCount - 1).z == 1) Destroy(gameObject);
                 else enabled = false;
             }

             mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
             mousePos.z = 0;

             if (!pointsList.Contains(mousePos))
             {
                 pointsList.Add(mousePos);
                 line.positionCount = pointsList.Count;
                 line.SetPosition(pointsList.Count - 1, (Vector3)pointsList[pointsList.Count - 1]);

                 try
                 {
                     AddColliderToLine(line, (Vector3)pointsList[pointsList.Count - 2], (Vector3)pointsList[pointsList.Count - 1]);
                 }
                 catch(Exception e)
                 {

                 }
             }   
         }
     }
     
     //    -----------------------------------   
     //    Following method checks whether given two points are same or not
     //    -----------------------------------   
     private bool checkPoints(Vector3 pointA, Vector3 pointB)
     {
         return (pointA.x == pointB.x && pointA.y == pointB.y);
     }

     private void AddColliderToLine(LineRenderer line, Vector3 startPoint, Vector3 endPoint)
     {
         //create the collider for the line
         GameObject lcObject = new GameObject("LineCollider");
         BoxCollider2D lineCollider = lcObject.AddComponent<BoxCollider2D>();
         
         lcObject.layer = 2; // ignore raycast

         //set the collider as a child of your line
         lineCollider.transform.parent = line.transform;
         // get width of collider from line
         float lineWidth = line.endWidth;
         // get the length of the line using the Distance method
         float lineLength = Vector3.Distance(startPoint, endPoint);
         // size of collider is set where X is length of line, Y is width of line
         //z will be how far the collider reaches to the sky
         lineCollider.size = new Vector3(lineLength, lineWidth);
         // get the midPoint
         Vector3 midPoint = (startPoint + endPoint) / 2;
         
         // move the created collider to the midPoint
         lineCollider.transform.position = midPoint;
         

         //heres the beef of the function, Mathf.Atan2 wants the slope, be careful however because it wants it in a weird form
         //it will divide for you so just plug in your (y2-y1),(x2,x1)
         float angle = Mathf.Atan2((endPoint.y - startPoint.y), (endPoint.x - startPoint.x));

         // angle now holds our answer but it's in radians, we want degrees
         // Mathf.Rad2Deg is just a constant equal to 57.2958 that we multiply by to change radians to degrees
         angle *= Mathf.Rad2Deg;

         //were interested in the inverse so multiply by -1
         //angle *= -1;
         // now apply the rotation to the collider's transform, carful where you put the angle variable
         // in 3d space you don't wan't to rotate on your y axis
         lineCollider.transform.Rotate(0, 0, angle);
     }
}


Вернуться наверх
 Профиль Отправить e-mail  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 101 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB