unity3D 從攝像機發射射線,檢測畫線

最近做項目的時候,有一個需要從攝像機發出一條射線,當射線檢測到有碰撞物體的時候,點擊鼠標左鍵開始畫線。我是創立了一個平板drawing,當然Cube什么的也是可以的。
c#腳本代碼,將這個腳本拖到攝像機里,然后拖拽材質到畫線材質,拖拽碰撞體到腳本那里即可以。
代碼腳本(附有注釋):
<pre><code>
using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

//-----------劃線所能夠用到材質  
 public Material lineMaterial  ;  
//  
  int maxPoints = 5000;  
  //全局變量的定義方法  
 public static float lineWidth = 4.0f;  
 int minPixelMove = 2;  // Must move at least this many pixels per sample for a new segment to be recorded  
 public Vector2[] linePoints;  
 private VectorLine  line ;  
 private int  lineIndex = 0;  
  private   Vector2   previousPosition;  
  private int  sqrMinPixelMove ;  
  private bool canDraw = false;  
//記錄當下畫板的位置,判斷平板是否平移等  
  public Vector3 boardPosition;  
  public GameObject board;  
//記錄當下畫板的大小,判斷畫板是否縮放等     
 public Vector3 boardScale;   
//初始化平板的大小與位置  
void IntializeScaleAndPosition()  
{  
    boardPosition=Camera.mainCamera.WorldToScreenPoint(board.transform.position);  
    boardScale=board.transform.localScale;  
      
}  
// 初始化  
void Start () {  
    linePoints = new Vector2[maxPoints];  
    line = new VectorLine("DrawnLine", linePoints,lineMaterial, lineWidth, LineType.Continuous);  
    sqrMinPixelMove = minPixelMove * minPixelMove;  
    IntializeScaleAndPosition();  
}  
// Update is called once per frame  
void Update () {  
    Vector2 mousePos = Input.mousePosition;  
    //當畫板移動時,將所有的點按照統一方向移動相同的距離
   //當前畫板的位置  
   Vector3 currentBoardPositon=Camera.mainCamera.WorldToScreenPoint(board.transform.position);  
      
    //畫板的移動距離  
    Vector3  moveDistance=currentBoardPositon-boardPosition;  
      
    if(moveDistance.x!=0||moveDistance.y!=0)  
    {  
        //將所有的畫下的點都平移  
        for(int i=0;i<linePoints.Length;i++)  
        {  
        Vector2 dis=new Vector2(moveDistance.x,moveDistance.y);  
        linePoints[i]+=dis;  
        }  
        //銷毀當前畫下的線  
        Vector.DestroyLine(ref line);  
          
        //距離平移后,所有的點的位置已經重新獲得,重新畫下新的線  
          
         line = new VectorLine("DrawnLine", linePoints, lineMaterial, lineWidth, LineType.Continuous);  
         line.minDrawIndex = 1;  
         line.maxDrawIndex = lineIndex;  
        Vector.DrawLine(line);  
          
    }     
    boardPosition=Camera.mainCamera.WorldToScreenPoint(board.transform.position);  
    //平板的縮放操作,對平板進行縮放,同時畫出的線也要能夠實現縮放。  
    //檢測平板是否已經開始縮放  
    float currentScale=board.transform.localScale.x;  
    float scaleFactor=currentScale/(boardScale.x);  
    //Debug.Log("scaleFactor "+scaleFactor+" currentScale "+currentScale+" boardScale "+boardScale.x);  
    boardScale=board.transform.localScale;  
    if(scaleFactor!=1||scaleFactor!=1)  
    {     
        // 求出畫板中心的位置  
        Vector3 boardPostionToSceern=Camera.mainCamera.WorldToScreenPoint(board.transform.position);  
          
          //當平板縮放時,所有的點都要同比例縮放。  
        for(int i=0;i<linePoints.Length;i++)  
        {  
        Vector3 pointPositon=new Vector3(linePoints[i].x,linePoints[i].y,0);  
        Vector3 PointToCenterDistance=(pointPositon-boardPostionToSceern)*scaleFactor;  
        linePoints[i]=new Vector2((boardPostionToSceern+PointToCenterDistance).x,(boardPostionToSceern+PointToCenterDistance).y);  
        }         
        //銷毀當前畫下的線  
        Vector.DestroyLine(ref line);  
        //畫板縮放后,所有的點的位置已經重新獲得,重新畫下新的線  
         line = new VectorLine("DrawnLine", linePoints, lineMaterial, lineWidth, LineType.Continuous);  
         line.minDrawIndex = 1;  
         line.maxDrawIndex = lineIndex;  
        Vector.DrawLine(line);    
    }  
    //從攝像頭發出一條射線  
    Ray ray=Camera.mainCamera.ScreenPointToRay(Input.mousePosition);  
    RaycastHit hit;  
    if(Physics.Raycast(ray,out hit,1000))  
    {     
    //檢測到物體時才開始畫  
    if(hit.transform.gameObject.name=="drawing")  
    {         
        if (Input.GetMouseButtonDown(0))  
        {  
          //  Vector.ZeroPointsInLine(line);  
           // line.minDrawIndex = lineIndex;  
          //  Vector.DrawLine(line);  
           // linePoints[lineIndex] = mousePos;  
            previousPosition  = mousePos;  
            lineIndex++;  
            linePoints[lineIndex] = mousePos;  
            canDraw = true;  
        }  
        else if (Input.GetMouseButton(0) && (mousePos - previousPosition).sqrMagnitude > sqrMinPixelMove && canDraw)  
        {  
            previousPosition = linePoints[++lineIndex] = mousePos;  
            line.minDrawIndex = lineIndex - 1;  
            line.maxDrawIndex = lineIndex;  
            if (lineIndex >= maxPoints - 1) canDraw = false;  
            Vector.DrawLine(line);  
        }                 
    }     
}  

</code></pre>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容