4.1 LSL 語法

什麼是LSL Programming

 是一個在Second Life裡所使用的程式語言,主要是用來控制Second Life裡的AvatarObject的動作

 

  • 如何開始?

 

         首先先打開「Build」視窗,然後選擇"Create"(有仙女棒的圖示),選擇想要Create的物件形狀,然後鼠標會變成仙女棒的樣子,點在Avatar的旁邊,就會創造出你所選擇的物件形狀。然後在「Build」視窗下選擇「Content」分頁,裡面有個「New Script」按鈕,點下去後就會自動為這個物件新增一個屬於它的Script,對「New Script」這個檔左鍵點兩下開啟,裡面就會有預設寫好的Script    

  • 如何編譯?

     只要在寫好的Script視窗下,點選」Save」就可以編譯了。如果有錯誤,除錯視窗就會告訴你錯在哪裡?如果沒錯就會出現」Compile successful!  Save complete.」

 

  • 程式碼的基本架構

範例程式

<code>

//變數---------------------------------------------------------------------------------------------------
string sayHello = "Hello! Second Life~";//全域變數,在這個Script裡都可以直接呼叫他
//自訂function-------------------------------------------------------------------------------------
globalFunction()
{
llSay(0,getSayHello());
}
string getSayHello()
{
return sayHello;
}
//初始state-------------------------------------------------------------------------------------------

default
{
state_entry()//所有state一開始會進入的event
{
llSay(0, "開始啟動state default");//LSL提供的Function,作用是在聊天的視窗顯示所傳的string內容
}
touch_start(integer total_number)//當Second life裡的使用者,做出touch的動作時所進入的event
{
state callGlobalFunction;//轉換到自訂的state區塊:callGlobalFunction
llSay(0, "我不會執行");
}
state_exit()
{
llSay(0, "離開此state");
}
}

//自訂state-----------------------------------------------------------------------------------------------
state callGlobalFunction
{
state_entry()
{
globalFunction();//呼叫自訂的Function
state default;//呼叫default
}
}

</code>

1.LSL語法

(PS.下面的項目主要是根據上面的範例程式碼來解釋有哪些重點,所以只有簡單的介紹而已,希望之後有人再根據這幾大項來一一介紹裡面的內容)

  • 註解:跟JAVA語法一樣只要打上"//"兩條斜線,斜線所在的那行後面就變成註解了,只是LSL沒有像JAVA一樣可以用"/**/"來變成多行註解,一次只能用一行而已
  • Types(資料型態):像是上面範例程式碼的string sayHello = "Hello! Second Life~";這行,sayHello這個變數就是string type
  • Functions(函式):像是globalFunction()或llSay(0, "開始啟動state default");都是Function,差別在一個是自訂的,一個是LSL所提供的。自訂的Function就得自己定義,而LSL的所提供的Function不可以再自己定義來覆蓋它。而且LSL所提供的Function前面一定會有兩個小寫的L來區分
  • Flow Control
  • (一)States(狀態區塊):像是state callGlobalFunction,和上述程式碼的default也是state主要是讓Second  Life知道現在有哪些事件要監聽如果一個state裡包覆太多事件佔用的資源就會太多程式執行的效率就會降低所以才要有一個一個的state來區分

    (二)Return(回傳資料):像是function getSayHello()內的return sayHello;就是回傳一個sayHello的字串

  • Events(事件):像是上面範例程式碼的state_entry ()touch_start (integer total_number)等等,這些撰寫在state裡,像是function的樣子都是Event,都是由Second Life來監聽的,它會自動執行事件內的程式碼
  • Constants(常數):像是圓周率π,在LSL裡就直接打上"PI"就代表圓周率了,不過在此範例程式碼沒有使用到
  • Operators(運算子):像是上面範例程式碼的string sayHello = "Hello! Second Life~";這行裡的「=」就是運算子
  • 2.LSL程式碼撰寫的特殊規定

  • LSL主要是由event所驅動的,所以state裡只能有event的區塊,最後才能在event裡撰寫程式碼運算。
  • default區塊以上,屬於自訂變數或自訂function區,而以下則是自訂state區,要是放錯區域,會出現編譯錯誤
  • stateevent裡可以呼叫自訂function,但是不可以在自訂function內呼叫state
  • 只有default區前面不需要打上state,其他的自訂state都要打。不過從別的state呼叫default時,一樣要打上state就是了
  • 3.程式碼的執行

    • 首先所有Script一開始一定都會從default開始執行。
    • 如果在該state裡有state_entry()事件的話進入這個state區一定會先執行這個事件那如果有state_exit()這個事件的話,在離開這個state時,也會優先執行完此事件,才會離開此state
    • 在state區內如果沒有呼叫其他的state的話,它就會卡在這個state裡,所以Second Life就只會監聽這個state裡的事件,不會監聽其他state裡的事件,若是在轉換state後面有打上程式碼的話,則不會跳回去執行。像是上面範例程式碼的  llSay(0, "我不會執行");  這段程式碼就永遠不會執行

    Second Life動畫製作
    (QAvimator部份)

    • 在Second Life中所支援的動畫格式為:*.bvh檔
    • 我們可以利用Maya、QAvimator等程式製作動畫檔
    • 動畫製作教學 (在此以QAvimator為例):
      • Step 1:下載QAvimator
      • Step 2: 安裝QAvimator後,我們可以設定該動畫的角色:
        • 性別:Male / Female
        • 所欲編輯的部位: ex: 頭、四肢、胸部、臀部
        • 設定所欲編輯部位的x、y、z軸座標
        •  FPS (Frame Per Second)值
        • 最後就是做重要的各個frames的動作
      • Step 3:
        • 在設定好我們各個frames的動作後,我們可以按下最下面的">" 鈕,就可以從頭開始瀏覽你所設定Avatar的動作了,或是我們可以拖曳最下面的橫槓來瀏覽我們所製作的動畫;QAvimator會自動將你的Avatar各個frames的動作連結起來,就如同我們在使用Flash製作動畫,如此我們便不需要每個frame都去編輯一次動作,相當的方便
      • Step 4:
        • 在我們製作好我們的動畫後,我們可以點選上面的"Save files"圖示,將我們所製作好的動畫存成.*bvh檔,如此便完成了QAvimator的動畫製作

    Second Life動畫製作
    (Second Life部份)

  • 在Second Life中我們每上傳一個動畫需要花費L$10
  • 注意:在QAvimator中所製作的動畫,上傳至Second Life中後有可能會不同,若使用Maya... etc 工具製作或許會有較精確的成果?!
  • 在Second Life中動畫製作最為高明的行業為:色情行業
  • 動畫上傳教學:
    • Step 1: 點選"File"→"Upload Animation (L$10)"

    • Step 2: 選取你剛利用QAvimator所製作出來的*.bvh檔

    • Step 3: 在這邊可以設定關於這個動畫的:
      • Name:動畫名稱
      • Description:動畫簡介
      • Priority:優先權
        • (數值越高,越會在上層中顯示,Priorty較高層會蓋過Priorty較低層的動畫)
        • 關於Second Life各個動作的Priorty值可以點此觀看
      • Loop:是否重複播放
      • In(%):從所上傳的*.bvh檔第%部份開始播放
      • Out(%):到所上傳的*.bvh檔第%部份結束播放
      • Hand Pose:播放動畫時Avatar的手部動作
      • Expression:播放動畫時Avatar的臉部表情
      • Preview while:在Preview視窗中的姿勢
      • Ease in (sec):Avatar從他原本的的動作逼真的轉換至動畫的動作所需的時間
      • Ease out (sec):Avatar從動畫的動作逼真的轉換至其最高Priority動畫的動作所需的時間
      • 預覽視窗:預覽角色套用此動畫設定的動作
    • Step 4: 設定完成,點選"Upload (L$10)"上傳動畫

    • Step 5: 上傳成功,我們可以在自己的"Inventory"→"Animation"中看到自己剛剛所上傳的動畫嚕

    • Step 6: 點選此動畫檔,我們便可以選擇:
      • Play in World:在整個世界中播放
        • (讓你的Avatar播放所點選的動畫,所有的使用者都可以看得到)
      • Play Locally:僅在自己的View中播放
        • (讓你的Avatar播放所點選的動畫,但只有你自己可以看得到)
          PS:也可以從物件來啟動事件來做動畫
          1.把製作上傳的動畫丟入物件(就是dicing)

          2.接者寫入這些程式碼
        • key gOwner;
        • string gLastAnimation;
        • default
        • {
        •       touch_start(integer detected)
        •      {                llRequestPermissions(llDetectedKey(0),    PERMISSION_TRIGGER_ANIMATION);
           
              }
              run_time_permissions(integer perm)
              {
                  if (perm & PERMISSION_TRIGGER_ANIMATION)
                  {
                      llStartAnimation("dicing");
                      llSetTimerEvent(5.0);
                  }
              }
              timer()
              {
                  llSetTimerEvent(0.0);
                  llStopAnimation("dicing");
              }
          }
        • 主要由
        • llStartAnimation(string Animationname)
        • 來控制
        • Animationname為動畫名
        • 該程式為按下該物件後碰觸物件的人物就會做出dicing的動作
        • 5秒後結束動畫