2016-09-22 5 views
0

마우스를 끌어서 일부 선을 그립니다. 나는이 스크립트를 사용하여 그렇게했다. 내 라인이 장면에서 어떤 게임 오브젝트와 충돌 할 때 게임 개체가 lineRender와 충돌 할 때 충돌을 감지하는 방법?

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class DrawLine : MonoBehaviour 
{ 
    private LineRenderer line; 
    private bool isMousePressed; 
    private List<Vector3> pointsList; 
    private Vector3 mousePos; 

    // 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 = new Material(Shader.Find("Particles/Additive")); 
     line.SetVertexCount(0); 
     line.SetWidth(0.1f,0.1f); 
     line.SetColors(Color.green, Color.green); 
     line.useWorldSpace = true; 
     isMousePressed = false; 
     pointsList = new List<Vector3>(); 
//  renderer.material.SetTextureOffset(
    } 
    // ----------------------------------- 
    void Update() 
    { 
     // If mouse button down, remove old line and set its color to green 
     if(Input.GetMouseButtonDown(0)) 
     { 
      isMousePressed = true; 
      line.SetVertexCount(0); 
      //pointsList.RemoveRange(0,pointsList.Count); 
      line.SetColors(Color.green, Color.green); 
     } 
     else if(Input.GetMouseButtonUp(0)) 
     { 
      isMousePressed = false; 
     } 
     // Drawing line when mouse is moving(presses) 
     if(isMousePressed) 
     { 
      mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
      mousePos.z=0; 
      if (!pointsList.Contains (mousePos)) 
      { 
       pointsList.Add (mousePos); 
       line.SetVertexCount (pointsList.Count); 
       line.SetPosition (pointsList.Count - 1, (Vector3)pointsList [pointsList.Count - 1]); 
       if(isLineCollide()) 
       { 
        isMousePressed = false; 
        line.SetColors(Color.red, Color.red); 
       } 
      } 
     } 
    } 
    // ----------------------------------- 
    // Following method checks is currentLine(line drawn by last two points) collided with line 
    // ----------------------------------- 
    private bool isLineCollide() 
    { 
      // if (gameObject.tag == "default") { 

         if (pointsList.Count < 2) 
           return false; 
         int TotalLines = pointsList.Count - 1; 
         myLine[] lines = new myLine[TotalLines]; 
         if (TotalLines > 1) { 
           for (int i = 0; i < TotalLines; i++) { 
             lines [i].StartPoint = (Vector3)pointsList [i]; 
             lines [i].EndPoint = (Vector3)pointsList [i + 1]; 
           } 
         } 
         for (int i = 0; i < TotalLines - 1; i++) { 
           myLine currentLine; 
           currentLine.StartPoint = (Vector3)pointsList [pointsList.Count - 2]; 
           currentLine.EndPoint = (Vector3)pointsList [pointsList.Count - 1]; 
           if (isLinesIntersect (lines [i], currentLine)) 
             return true; 
         } 
      // } 
     return false; 
    } 

    // ----------------------------------- 
    // 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); 
    } 
    // ----------------------------------- 
    // Following method checks whether given two line intersect or not 
    // ----------------------------------- 
    private bool isLinesIntersect (myLine L1, myLine L2) 
    { 
     if (checkPoints (L1.StartPoint, L2.StartPoint) || 
      checkPoints (L1.StartPoint, L2.EndPoint) || 
      checkPoints (L1.EndPoint, L2.StartPoint) || 
      checkPoints (L1.EndPoint, L2.EndPoint)) 
      return false; 

     return((Mathf.Max (L1.StartPoint.x, L1.EndPoint.x) >= Mathf.Min (L2.StartPoint.x, L2.EndPoint.x)) && 
       (Mathf.Max (L2.StartPoint.x, L2.EndPoint.x) >= Mathf.Min (L1.StartPoint.x, L1.EndPoint.x)) && 
       (Mathf.Max (L1.StartPoint.y, L1.EndPoint.y) >= Mathf.Min (L2.StartPoint.y, L2.EndPoint.y)) && 
       (Mathf.Max (L2.StartPoint.y, L2.EndPoint.y) >= Mathf.Min (L1.StartPoint.y, L1.EndPoint.y)) 
       ); 
    } 
} 

enter image description here

지금 어떻게 뭔가를 인쇄하려면 ??? 라인이 내 gameobject와 충돌 할 때 다른 장면으로 이동한다고 말하고 싶다는 뜻입니다.

답변

1

업데이트 방법의 LastPosition에서 CurrentPosition까지 Raycast를 사용할 수 있습니다. https://docs.unity3d.com/ScriptReference/Physics.Raycast.html 예 : http://xenforo.unity3d.com/threads/general-purpose-method-for-better-collision-solving.64781/

+0

URL을 제공하는 대신 코드 샘플도 제공해야합니다. 때로는 URL이 더 이상 유효하지 않을 수 있으며이 대답은 쓸모 없게됩니다. – Programmer

+0

내 라인에는 스크립트가있는 콜 리더가 없습니다. 라인이 서로 충돌 할 때 충돌을 감지하기 위해 뭔가를했습니다. 그러나 라인은 다른 게임 개체와 충돌하지 않습니다. 다른 게임 개체와 충돌하지 않습니다. – NewHacker

+0

@NewHacker 레이 캐스트는 다른 개체가 아닌 임의의 개체에서 충돌자를 공격하기위한 것입니다. 이것은 현재 라인 교차 테스트를 방해하지 않습니다. – Serlite