1. ホーム
  2. ルア

Luaでよくある問題の解決法

2022-02-24 17:05:45

require "uiDefine"。

エラーメッセージ: モジュール 'uiDefine' が見つかりませんでした。

fieldpackage.preload['uiDefine'] がない。

そのようなビルトイン lib'uiDefine' はありません。

回避策 require "ui.uiDefine" で。  luaベースのルートディレクトリの下で、フルパスを要求します。 資産/スクリプト/lua はルートディレクトリ

静的 パブリック クラス UnityCommonExtension

{ <未定義

静的 パブリック ボイド DestroyAllChildren ( この GameObject ターゲット )

           { <未定義

 ( トランスフォーム 対象 . トランスフォーム )

       { <未定義

ゲームオブジェクト . デストロイ ( . ゲームオブジェクト );

       }

    }

}

for i = 1, #headIconParent do

                   headIconParent[i]:DestroyAllChildren()を実行します。

終了

         もし

公開 静的 クラス LuaGenConfig

{ <未定義

//ルア でC#を使うには C#標準ライブラリ、またはUnityAPI、サードパーティライブラリなどのライブラリの設定。

   [ LuaCallCSharp ]

公開 静的 リスト <です。 <スパン タイプ >  LuaCallCSharp  =  <スパン 新しい リスト <です。 <スパン タイプ >()

{ <未定義

//typeof(UnityCommonExtension)です。

}

}

エラーメッセージ: nil 値を呼び出そうとしました (メソッド 'DestroyAllChildren')

回避策

for i = 1, #headIconParent do

                   CS.UnityCommonExtension.DestroyAllChildren(headIconParent[i])を実行します。

終了

または  LuaGenConfig それを追加し、次に  headIconParent[i]:DestroyAllChildren()を実行します。

または headIconParent[i].DestroyAllChildren(headIconParent[i])

for i = 1, pairs(headIconParent) do end

エラーメッセージが表示されます。for' limitは数値でなければなりません。

解決策: for i= 1, #headIconParent do end を使用します。

また、for k, v pairs(headIconParent) do end も有効です。

C#の配列がluaに渡される。

local widgets = {}--go:GetComponentsInChildren("UIWidget",true)    

           ローカル widArr = InterfaceForLua.GetWidgetArray(go)。

           for i = 0, widArr.Length - 1 do.

             table.insert(widgets, widArr[i])

           終了

しかし、c#のリストをluaに渡しても認識されない。

メソッドを定義している場合は function()#### end と書き、そうでない場合は渡されたメソッドではなく、呼び出しを実行する関数を省くようにします。

luaのメソッドの定義, : 定義: call, . 定義. c#のスタティックメソッド呼び出しでも、selfを省略してcall , : が使われます。

function UIItemIconInfo:CreateItemIcon(itemNum, parent, uniqueName)

         ローカル go = ResUtil.LoadGameObject("UI/CommonIcon/ItemIconInfoLua")

    ローカルスクリプト = {}

         setmetatable(script,{__index = UIItemIconInfo})

script.gameObject = go

    script.Data = itemNum

         script.eName =uniqueName

         script:InitEvent()を実行します。

    script:awake()

    script:onBindComplete()を実行します。

script:start()

    if parent ~= nil then

     parent:AddChildEx(go.transform)を実行します。

    終了

    go.name =string.format("アイテム%s", tostring(itemNum.ItemId))

    if parent ~= nil andparent:GetComponent("UIWidget") ~= nil then

      ローカル parentDepth = parent:GetComponent("UIWidget").depth。

      local widgets = {} localwidArr = InterfaceForLua.GetWidgetArray(go)(インターフェースForLua.GetWidgetArray(go)

           for i = 0, widArr.Length - 1 do.

             table.insert(widgets, widArr[i])

           終了

           for k in pairs(widgets) do

                   ウィジェット[k].depth= ウィジェット[k].depth + parentDepth

           終了

    終了

         スクリプトを返す

終了

function UIItemIconInfo:onBindComplete()

  self:SetMask(false)を実行します。

  self:ItemIconCanClick(true)を指定します。

 self:AddDragScrollView(false, nil)

 self:SetItemIconScale(Vector3.one)を設定します。

 self:SetBackGroundVisable(true,true)です。

         self:SetSelectHide(true)を指定します。

終了

関数 UIItemIconInfo:SetMask(bVis)

  マスク:SetActive(bVis)

終了

シングルトンで self を使用する

以上が、luaのシングルトンの使い方です。

ローカルウィジェット = {}

local widArr = InterfaceForLua.GetWidgetArray(go) - これは、c#から渡されたUIWidget[]です。

logError(typeof(widgets). " ". .typeof(widArr)) -- テーブル userdata

-- widgets = widArr -- うまくいけば、テーブルは等しく、それらは参照であり、一方が他方を変更します。

         table.insert(widgets,widArr) --うまくいけば、テーブルの挿入は、別のテーブルです。

エラーメッセージ: ユーザーデータ値の長さを取得しようとしました。

回避策:userdata を繰り返し、テーブルを挿入します。

for i = 0, widArr.Length - 1 do

         table.insert(ウィジェット,widArr[i])

終了

--------------forループ

for i = 1, #widgets do

ウィジェット[i].深さ = ウィジェット[i].深さ + parentDepth

終了

for k in pairs(widgets) do

print(k)

         ウィジェット[k].深さ = ウィジェット[k].深さ + parentDepth

終了

------- 両方とも同じことをする

ローカル widArr = InterfaceForLua.GetWidgetArray(go) 5.2 以前の長さを取得するためにローカル変数 widArr.Length を追加しました。 テーブル .getn

LuaException: ui.CommonIcon.UIItemIconInfoLua:157: nil値(フィールド 'depth')に対して演算を行おうとした結果です。

スタックトレースバック。

         ui.CommonIcon.UIItemIconInfoLua:157:in フィールド 'CreateItemIcon'(アイテムアイコン)

解決方法

LuaException: c# exception:Non-static method requires atarget.,stack: atSystem.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlagsinvokeAttr, System.Reflection.Binder binder, System.Object[] parameters,System.Globalization.CultureInfo culture) [0x000fe] in/Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:236

  MethodBase.Invoke (System.Object obj, System.Object[]parameters) [0x00000] in/Users/builduser/buildslave/mono/build /mcs/class/corlib/System.Reflection/MethodBase.cs:115

  atXLua.OverloadMethodWrap.Call (IntPtr L) [0x00151] inE:\redemptionproject╱V2AssetsⒸLuaSrcⒸMethodWarps╱Cache.cs: 220

  at XLua.MethodWrap.Call(IntPtr L) [0x00036] inE:\redemptionV2Assets╱XLuaSrc╱MethodWarpsCache.cs:260

スタックトレースバック。

         [C]: フィールド 'SetActive' で。

解決策:'SetActive' はスタティックメソッドではないので、次のようにアクセスします。

UIItemIconInfo script = go:GetComponent('UIItemIconInfo')です。

エラーメッセージ: 'script'付近のシンタックスエラー

回避策:ローカルとして宣言するだけ

go.transform.localScale = CS.UnityEngine.Vector3(0.7f, 0.7f, 0.7f) (luaではnewなし)

エラーメッセージ: '0.7f'付近の数値が不正です。

解決策:fを削除してください。luaにはintegerやfloatといった型はなく、数値で表現されます。

文字列値に対して算術演算を行おうとする。

スタックトレースバック。

解決方法 これは現在、c#の構文で書かれており、+を.に変えています。例えば print("AAAAAAAbbb: " + tostring(Data.Reward.Count)) のような感じです。

LuaException: error loading modulecoruntine_test from resource, coruntine_test.lua:29: syntax error near 'local'.

スタックトレースバック。

         [C]:in ?

         [C]:in function 'require'

         [string"chunk"]:1: メインチャンク内

解決策:29行目の呼び出しでチェックを配置し、requireの場所に来る、例えば、check = number assignment