1. 程式人生 > >Unity3D學習筆記(三十):Lua

Unity3D學習筆記(三十):Lua

path 單行 一個數 eat 之間 分享 mst pat ole

Lua:是一個輕量級的腳本語句。不需要編譯,直接運行的語言。 環境配置: 執行Lua有兩種方式: 1、交互式編程(輸入後能立即看到效果) 2、腳本式編程:運行lua文件,.lua為文件後綴 Lua語句結尾不需要用分號結束,寫了分號也沒有問題。 刪除一個中文字符,需要按兩下刪除 註釋: 單行註釋:-- 多行註釋:--[[...]]--或--[[...--]]或--[[...]]
print("Hello World")

--單行註釋
--print("單行註釋")

--多行註釋
--[[
print("多行註釋1")
]]

--[[
print("多行註釋2")
--]]
--[[ print("多行註釋3") ]]
變量定義: Lua不需要寫變量類型,變量名 = 值。 Lua的標識符(變量名),1個字母或下劃線開頭,後跟0個或多個字母、數字、下劃線 Lua是區分大小寫的。 變量存儲什麽類型的數據,就是什麽類型的變量。 使用type()來獲取變量的類型。 Lua的數據類型: number:小數類型(lua沒有整型和浮點的區分),對應C#的int,float,double(浮點類型不能加f) boolean:布爾類型,true和false。Lua裏把false和nil看作是假,其他的都是真。 nil:表示空數據,等同於null。對於未被定義的變量,想要使用的話得到的都是nil。 string:字符串類型,可以使用雙引號,單引號,[[...]]表示。([[...]]與註釋有歧義,不推薦使用) 1、在對兩個字符串類型的變量,進行算數操作的時候,加減乘除求余,Lua會嘗試把這兩個字符串去轉換成數字去做計算,如果字符串轉換不成功則報錯。 2、使用..來做兩個字符串的連接。 3、使用#來計算字符串的長度,放在字符串的前面。
--
變量定義 --C# --int a = 1; --Lua a = 1 A = 2 _ = 3 print(a) print(A) print(_) --變量賦值 b = true print(b) print(type(b)) b= 4 print(b) print(type(b)) --number類型 c = 1 d = 1.2 print(c) print(type(c)) print(d) print(type(d)) --三種打印字符串的方式 e = "Hello World" f = Hello World g = [[Hello World]] print(e, f, g)
--..連接字符串 x = "1" y = "2" print(x + y)--加號表示算數運算 print(x .. y) --#計算變量長度 print(#e) print(#"Hello World") print(#"你好")--漢字占兩個字節
table類型:table表示一個數組的時候,默認索引是從1開始的 創建:b = {} table並不是一個數組,實際是一個“關聯數組”,關聯數組的索引可以是數字,也可以是字符串
--C# int[] a = new int[]{1, 2, 3};

--Lua的table
a = {1, 6, 3}
print(a[1])
print(type(a))

--創建一個空表
b = {}

--創建一個表,並且對表進行初始化賦值
c = {"string", true, 1, nil}

--table的訪問
print(c[1])

--table的修改
c[1] = 100
print(c[1])

print(#c)--能算table長度,但不一定是真實長度

--table的添加
c[5] = 200

--table的方法:數組的插入和刪除(索引的連續性)
--第一個參剩:表的名字
--第二個參數:插入的內容
--依次向後找,只要找到一個nil的位置就把內容插入進去
table.insert(c, "你好")
print(c[4])--結果:你好

--第二個參數:要插入的位置,可以跳躍性的插入
table.insert(c, 10, "小明")
print(c[10])--結果:小明

--從第三個位置的元素開始,後面的元素依次後移
table.insert(c, 3, "小紅")
print(c[3])--結果:小紅
print(c[4])--結果:1

--刪除
--刪除指定索引的位置的元素,後面的元素依次前移
d = {1, 4, "你好", true}
table.remove(d, 1)
print(d[1])--結果:4

--刪除連續索引的最後一個元素
d[6] = 10
table.remove(d)
print(d[3])--結果:nil
print(d[6])--結果:10

--table的索引
a = {}
a[1] = 0
print(a[1])

--把字符串作為一個索引
a["a"] = "nihao"
print(a["a"])

--table可以有0號索引
a[0] = 10
print(a[0])
--table可以有負號索引
a[-1] = 100
print(a[-1])

print("-----------------")
b = {[2] = 10, 1, 2, 3, 5, [-1] = 30, ["nihao"] = "你好", key = "不好", c = {1, 5}}
print(b[1])
print(b[2])--會被覆蓋掉
print(b[3])
print(b[4])
print(b[5])
print(b[6])
print(b[7])
print(b[-1])
print(b["nihao"])

--第一種訪問字符串為索引的元素
print("-----------------")
print(b["nihao"])
--第二種訪問字符串為索引的元素
print(b.nihao)
print(b["key"])
print(b.key)
print(b.c[2])
--table.insert(c, 3, "小紅")--報錯:只能針對數組
--table.remove(c, 2)--報錯:只能針對數組

--添加字符串為索引的元素
b["key1"] = "可以"
b.key2 = "不可以"
d = "可不可以"
print(b.key1)
print(b["key2"])
print(b[d])

print(#b)--結果:4,從1號位索引開始算,一旦索引斷掉,就不往後面計算

f = {[2] = 2}
print(#f)
Lua中的運算符 數學運算符:+,-,*,/,%,^ Lua裏沒有自增自減運算符,也沒有+= *=之類的 關系運算符:>,<,==,>=,<=,~= Lua裏的不等於~= 邏輯運算符:and,or,not 流程控制語句
--流程控制語句
--C# if(條件){}

--Lua
--if語句
--[[
if 條件 then
    print("if語句滿足,執行")
end
]]--

if true then
    print("if語句滿足,執行")
end

--if else語句
if a then
    print("if語句滿足,執行")
else
    print("if語句不滿足,執行")
end

--if elseif語句
if a then--一般條件後面才加then關鍵字
    print("if語句滿足,執行")
elseif b then--註意elseif是連著的
    print("if語句不滿足,執行")
end

--if elseif else語句
if a then
    print("if語句滿足,執行")
elseif b then--註意elseif是連著的
    print("if語句不滿足,執行")
else
    print("if語句都不滿足,執行")
end

循環控制語句

--循環控制語句
--C# for,while,do while

--Lua
--while
a = 1
while a < 10 do
    print(a)
    a = a + 1
end

print("-------------")

--do while C#條件滿足繼續執行循?
--repeat 循環體 until 條件 條件滿足跳出循環
a = 1
repeat
    print(a)
    a = a + 1
until a < 10

print("-------------")

--for 變量定義,條件,每次循環累加值 do 循環體 end
--條件就是一個數,變量 <= 條件,每次累加值可以不寫,不寫默認為1
--對於循環,有break關鍵字跳出,但是沒有continue關鍵字
for a = 1, 10, 1 do
    print(a)
end
方法:調用方法時,一定是先定義,在調用!
--方法
function func3()
    func1()
end

--方法的定義1 function 方法名(參數) 方法體 end
function func1()
    print("func1")
end

--方法的定義2 方法名 = function(參數) 方法體 end
func2 = function()
    print("func2")
end

--方法的調用,先定義再調用
func1()
func2()
func3()

print("--------有參數的方法--------")

--有參數的方法
func4 = function(a, b)
    print(a, b)
end

func4()--可以不傳參數,按照nil處理
func4(1)--可以少傳
func4(1, 2)
func4(1, 2, 3)--可以多傳,只取前2個

print("--------可變參數的方法--------")
--可變參數的方法,參數位置用...表示是可以傳任意的參數
--通過arg來取傳入的參數,arg實際就是一表表示的數組
--當調用的時候,把所有傳遞進來的參數存入到arg中
func5 = function(...)
    print(#arg)
    for i = 1, #arg do
        print(arg[i])
    end
end

func5(1,2,3,54,6,7,8)
func5(1,"nihao",true,54,6,7,false,nil)

print("--------帶返回值的方法--------")
--帶返回值的方法
func6 = function()
    return "func6"
end

a = func6()
print(func6(), a)

print("--------帶多個返回值的方法--------")
--帶多個返回值的方法
--多個返回值使用多個變量去接收,每個變量之間以逗號區別
--返回值與接收變量可以數量不一致,多退少補
func7 = function()
    return "a", true, 1, false
end

r1,r2,r3,r4 = func7()

print(func7())
print(r1,r2,r3,r4)


func8 = function()
    local z = "c"
end

func8()
print("z:", z)

--
a = {1,2,3,4,5,67,78}

--遍歷
for i = 1, #a do
    print(a[i])
end

for key, value in ipairs(a) do
    print("key", key)
    print("value", value)
end

b = {1,2,4,5,[-1] = 5, ["key"] = "key", key1 = true}
--ipairs()這種方式只能比哪裏出數值類型
for key, value in ipairs(b) do
    print("key", key)
    print("value", value)
end
--pairs()這種方式能全部遍歷出鍵和值
for key, value in pairs(b) do
    print("key", key)
    print("value", value)
end
局部變量和全局變量 一般情況下,定義的變量都是全局的變量,包括方法內定義的 如果變量前多了local關鍵字,那麽證明該變量局部的變量
--lua8
print("開始執行Lua8")

local lua8 = {}
lua8.const = 10

function lua8.func1()
    print("func1")
end

lua8.func2 = function()
    print("lua8.func2")
end

function lua8.func3()
    print("lua8.func3")
end

print("結束執行Lua8")

return lua8

--lua10
print("開始執行Lua10")

local lua8 = {func4 = function() print("func4") end, key = 10}
lua8.const = 20

function lua8.func1()
    print("Lua10.func1")
end

lua8.func2 = function()
    print("Lua10.func2")
end

function lua8.func3()
    print("Lua10.func3")
end

print("結束執行Lua10")

return lua8

Lua11.lua文件,在根目錄下的Lua文件夾下

--Lua11
print("開始執行Lua11")

--require("Lua8")
--require(‘Lua8‘)
lua10 = requireLua10
lua8 = requireLua8

--func()
print(lua8.const)
print(lua10.const)

lua8.func3()
lua10.func3()

--package.path 裏存儲的都是require所能執行的lua的文件路徑
--print(package.path)

--package.path = package.path .. ";D:\\LuaProject\\Lua\\?.lua"
--..\\上級目錄,.\\文件的當前目錄
package.path = package.path .. ";.\\Lua\\?.lua"

print(package.path)

requireLua11
元表:改變規則的 Setmetatable(a, b)--把b設置成a的元表 Getmetatable(a)--返回a的元素 原方法的名字 算數類:__add(加)__sub(減)__mul(乘)__div(除)__unm(相反數)__mod(取余)__pow(求冪) 訪問類:__index(查詢)__newindex(修改table的字段) 關系類:__eg(等於)__lt(小於)等等
tab1 = {"tab1", "111", 222}
tab2 = {"tab2", 11, true}
Set = {__add = function(t1, t2)--__add原方法
            for k1, v1 in pairs(t1) do
                print(k1, v1)
            end
            print("--------------")
            for k1, v1 in pairs(t2) do
                print(k1, v1)
            end
            return "Set"
        end}
setmetatable(tab2, Set)--設置元表,把Set這個表設置成tab1的元表
t = tab1 + tab2
--當兩個表進行相加操作時,先判斷兩個表是否有元表?
--如果兩個表都沒有元表,兩個表不能進行相加操作
--如果兩個表任意一個表有元素
--再判斷元表內是否有__add的元方法
--如果元表裏沒有__add的元方法,不會執行,報錯
--如果有__add的元方法,那麽兩個表可以相加
--並且相加的結果,就是__add的返回值
--__add的參數1是加號左邊的表,參數2是加號右邊的表
print(t)

tab = getmetatable(tab2)
print(tab)
print("--------------")

tab3 = {key = "k1"}
Set1 = {__index = function(t1, key)
            print(type(t1))
            for k1, v1 in pairs(t1) do
                print(k1, v1)
            end
            print(type(key), key)
            return "Set1"
        end}

setmetatable(tab3, Set1)

--當你要訪問一個鍵對應值時,先判斷這個表中有沒有這個鍵,如果有就返回這個鍵對應的值
--如果這個表沒有這個鍵,先判斷這個表有沒有元表
--如果有元表,再判斷這個元表有沒有__index的元方法
--如果有,訪問的值就是這個__index返回的值
--__index裏的參數1:表,參數2:要訪問的鍵名

print(tab3.key1)
補充內容 邏輯運算符: 技術分享圖片 VS編譯:Ctrl + Shift + B fixedDuration:固定過渡,不許打斷
public float length { get; }//動畫播放時長
public float normalizedTime { get; }//動畫當前規範化時間,1是動畫結尾,0.5是動畫中間
public bool IsName(string name);
public bool IsTag(string tag);

技術分享圖片

public class SkillOverStateBehaviour : StateMachineBehaviour {
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        //PlayerController pc = animator.GetComponent<PlayerController>();//獲取動畫組件身上的腳本
        //pc.atkID = 0;//把腳本裏的atkID歸零
        //animator.SetInteger("skillID", 0);//把animator面板裏的skillID歸零
        animator.SetInteger("skillID", 0);
    }
}

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PlayerControl : MonoBehaviour   
{
    Animator anim;
    private void Awake()
    {
        anim = GetComponent<Animator>();
    }
    private void Start()
    {
       
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            AnimatorStateInfo animSta = anim.GetCurrentAnimatorStateInfo(0);
            if (animSta.IsName("skill1") && animSta.normalizedTime > 0.3f)
            {
                anim.SetInteger("skillID", 2);
            }
            else if(animSta.IsName("skill2"))
            {
                anim.SetInteger("skillID", 3);
            }
            else if(animSta.IsName("skill3"))
            {
                anim.SetInteger("skillID", 4);
            }
            else if(animSta.IsName("skill4"))
            {
                anim.SetInteger("skillID", 5);
            }
            else if(animSta.IsName("skill5"))
            {
                anim.SetInteger("skillID", 6);
            }
            else if(animSta.IsName("skill6"))
            {
                anim.SetInteger("skillID", 0);
            }
            else
            {
                anim.SetInteger("skillID", 1);
            }
        }
    }
}

Unity3D學習筆記(三十):Lua