質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Lua

Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。

Q&A

解決済

1回答

908閲覧

LuaスクリプトにてSteamのネットワーク対戦機能を記述したい

Kumakuma

総合スコア1

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Lua

Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。

0グッド

0クリップ

投稿2023/10/11 06:45

編集2023/10/11 07:57

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 作成している格闘ゲームを、Steamにてネットワーク対戦ができるようにしたい。

前提

ここに質問の内容を詳しく書いてください。

Ikemen_GO(Go言語+Lua)をベースに作成している対戦格闘ゲームがあり、それは元々ポート開放によるネットワーク対戦の機能を有している(直接IPアドレスを入力して繋げる)のですが、それをSteamにてリリースするにあたり、Steam match makingを利用する乃至Steam IDにて繋げられるように変更したい状態です。
Steamworks SDKはC++であると聞き及んでいますので、互換性のあるLuaスクリプトを変更しようとしています。
良い記述方法を教えていただけるとありがたいです。

発生している問題・エラーメッセージ

external/script/main.lua:4: module luasteam not found: no field package.preload['luasteam'] CreateFile .\luasteam.lua: The system cannot find the file specified. CreateFile C:\Users\00251110\Desktop\MGCMCE\lua\luasteam.lua: The system cannot find the path specified. CreateFile C:\Users\00251110\Desktop\MGCMCE\lua\luasteam\init.lua: The system cannot find the path specified., stack traceback: [G]: in function 'require' external/script/main.lua:4: in main chunk [G]: ?
external/script/main.lua:2709: attempt to index a non-table object(nil) with key 'networkingSockets' stack traceback: external/script/main.lua:2709: in function <external/script/main.lua:2706> external/script/main.lua:3225: in function 'loop' external/script/main.lua:3214: in function 'loop' external/script/main.lua:4181: in main chunk [G]: ?

該当のソースコード

Lua

1main = {} 2 3-- STEAM版 4 local Steam = require 'luasteam' 5 6-- ~中略~ 7 8 --SERVER CONNECT 9 ['serverconnect'] = function(t, item) 10 11 -- Steam版 12 local socket = Steam.networkingSockets.connectP2P(main.f_extractText(motif.title_info.connecting_join_text, t[item].displayname, config.IP[t[item].displayname]), 0) 13 14 if main.f_connect(config.IP[t[item].displayname], main.f_extractText(motif.title_info.connecting_join_text, t[item].displayname, config.IP[t[item].displayname])) then 15 synchronize() 16 math.randomseed(sszRandom()) 17 main.f_cmdBufReset() 18 main.menu.submenu.server.loop() 19 replayStop() 20 exitNetPlay() 21 exitReplay() 22 23 Steam.networkingSockets.closeConnection(socket) 24 25 end 26 return nil 27 end, 28 29 --SERVER HOST 30 ['serverhost'] = function(t, item) 31 32 -- Steam版 33 local socket = Steam.networkingSockets.createListenSocketP2P(0) 34 35 if main.f_connect("", main.f_extractText(motif.title_info.connecting_host_text, getListenPort())) then 36 37 Steam.networkingSockets.acceptConnection(socket) 38 39 synchronize() 40 math.randomseed(sszRandom()) 41 main.f_cmdBufReset() 42 main.menu.submenu.server.loop() 43 replayStop() 44 exitNetPlay() 45 exitReplay() 46 47 Steam.networkingSockets.closeConnection(socket) 48 Steam.networkingSockets.closeListenSocket(socket) 49 50 end 51 return nil 52 end,

IPアドレスを入力してネットワーク対戦が動く元々の記述は下記のようになっています。

Lua

1 --SERVER CONNECT 2 ['serverconnect'] = function(t, item) 3 if main.f_connect(config.IP[t[item].displayname], main.f_extractText(motif.title_info.connecting_join_text, t[item].displayname, config.IP[t[item].displayname])) then 4 synchronize() 5 math.randomseed(sszRandom()) 6 main.f_cmdBufReset() 7 main.menu.submenu.server.loop() 8 replayStop() 9 exitNetPlay() 10 exitReplay() 11 end 12 return nil 13 end, 14 --SERVER HOST 15 ['serverhost'] = function(t, item) 16 if main.f_connect("", main.f_extractText(motif.title_info.connecting_host_text, getListenPort())) then 17 synchronize() 18 math.randomseed(sszRandom()) 19 main.f_cmdBufReset() 20 main.menu.submenu.server.loop() 21 replayStop() 22 exitNetPlay() 23 exitReplay() 24 end 25 return nil 26 end,

試したこと

処理を行なっているmain.luaに、Luasteam( https://luasteam.readthedocs.io/en/stable/ )という、Steamworks SDKの機能をLua側で記述できるリポジトリ(luasteam.dll)を呼び出しさせて処理を試みようとしていますが、そもそも呼び出し時点で失敗している状態です。
(Luasteam側の案内に従い、main.luaと同フォルダ内(MGCMCE\external\script)に、luasteam.dllとリネームしたwin64_luasteam.dllおよび、Steamworks SDKからコピーしたsteam_api64.dllを配置した状態で、上記コードのように呼び出しを試みています)
呼び出しをコメントアウトすると当然ながら、ホストとしてネットワーク対戦を立ち上げようとした瞬間に落ちてしまいます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

Ikemen_GO v0.99.0-rc.1 ( https://github.com/ikemen-engine/Ikemen-GO ) を使用しています。
使用しているパソコンとOSは64bitのWindows 10 Proです。Ikemen_GOの通常の利用自体は問題なくできています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2023/10/11 07:31

「Luasteam( ... )という、Steamworks SDKの機能をLua側で記述できるリポジトリ(luasteam.dll)を同じフォルダに入れ、呼び出しさせて処理を試みようとしてい」るために実施したことを具体的に記してください。 (このコメント欄に書くのではないです。質問文を編集して書いてください。)
Kumakuma

2023/10/11 07:37

コメントありがとうございます。内容を追記させていただきました。 ご指導いただけますと幸いです。
ikedas

2023/10/11 07:48

「同フォルダ」とはどこでしょうか。 main.luaを置いているフォルダとluasteam.dllなどを置いているフォルダが同じという意味でしょうか。
ikedas

2023/10/11 07:50

Ikemen-GOが動作するOSの名前とバージョンも記してください。
Kumakuma

2023/10/11 07:57

ありがとうございます。さらに情報を追記させていただきました。
ikedas

2023/10/11 08:12

あと、package.cpathの値はどうなっているでしょうか。
Kumakuma

2023/10/11 08:54

すみません、package.cpathは記載しておらず、他のluaファイル内も検索してみましたが発見できず、どこにどのような状態で定義されているか把握できていません。 どのように記載すればよいでしょうか?
ikedas

2023/10/11 10:19

package.cpathはluaを実行するときに自動的に定義される変数です。その変数にどういう値が定義されているかを知りたいです。
Kumakuma

2023/10/11 12:39

すみません、何度もprintやerrorでpackage.cpathの確認を試みましたが、何度やっても何も出力されない状態であり、何も格納されていない状態なのではないかと思われました。
ikedas

2023/10/11 13:04 編集

なるほど状況はわかりましたが今日はもうお酒をのんでしまったなので明日回答します。
guest

回答1

0

ベストアンサー

おそらくpackage.cpathが設定されていないか、一般的でない設定がされているのではないかと思われます。

requireの前に次のようなコードを追加することで、スクリプトと同じフォルダにあるDLLを探しに行くようになるのではないかと思います。

package.cpath = './?.dll;' .. package.cpath

投稿2023/10/12 02:48

編集2023/10/14 11:20
ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kumakuma

2023/10/12 03:48

すみません、いただいたコードを追加してみたり、package.cpathの代入値を調整してみたりしましたが、いずれの内容においても、同様に下記のようなエラーが吐かれ、解決しません。 luasteam.dllの置き場所や、その他の記述に問題があったりするのでしょうか? external/script/main.lua:5: module luasteam not found: no field package.preload['luasteam'] CreateFile .\luasteam.lua: The system cannot find the file specified. CreateFile C:\Users\00251110\Desktop\MGCMCE\lua\luasteam.lua: The system cannot find the file specified. CreateFile C:\Users\00251110\Desktop\MGCMCE\lua\luasteam\init.lua: The system cannot find the path specified., stack traceback: [G]: in function 'require' external/script/main.lua:5: in main chunk [G]: ?
ikedas

2023/10/12 04:04

package.path にはどんなものが設定されていますか。
Kumakuma

2023/10/12 12:29

errorで吐かせてみました。 external/script/main.lua:6: .\?.lua;C:\Users\00251110\Desktop\MGCMCE\lua\?.lua;C:\Users\00251110\Desktop\MGCMCE\lua\?\init.lua stack traceback: [G]: in function 'error' external/script/main.lua:6: in main chunk [G]: ? 上記の.\?.lua;C:\Users\00251110\Desktop\MGCMCE\lua\?.lua;C:\Users\00251110\Desktop\MGCMCE\lua\?\init.luaの部分がpackage.pathの中身だと思われます(package.cpathでは空白になっていました)。 ここの値を変えるようにしてみればよいのでしょうか?
Kumakuma

2023/10/12 14:54

どうも、exeファイルのあるフォルダか、その直下の存在しないフォルダを探すようになっていたようですので、 package.path = './external/script/?.dll;' .. package.path と記述してみたところ、 external/script/main.lua:6: ./external/script/luasteam.dll line:1(column:3) near '・: Invalid token stack traceback: [G]: in function (anonymous) [G]: in function 'require' external/script/main.lua:6: in main chunk [G]: ? というエラーになりました。luasteam.dll自体は読めたようですが、その内部に問題があるのでしょうか。 何か記述方法に改善点はありますでしょうか?
ikedas

2023/10/13 04:52

package.pathはluaモジュールの読み込みに、package.cpathはCモジュール (DLL) の読み込みに使います。ですので、package.pathは機能している (DLLをluaスクリプトとして読もうとしたときは実行自体は失敗している) と考えられます。 package.cpathがまったく機能していないようなので、お使いのluaにはCモジュール (DLL) 読み込みの機能が入っていないのだと思われます。 公式WikiにもCモジュールについての言及はないようです。 https://github.com/ikemen-engine/Ikemen-GO/wiki/Lua なんだったら開発元のissueで質問してみてもいいかもしれません。 https://github.com/ikemen-engine/Ikemen-GO/issues
Kumakuma

2023/10/14 12:10

ありがとうございます。こちらも諸々相談、調査をしたところ、ikemen_GOのluaはgopher-luaというもので書かれているそうで、C言語を読み込めなくなっているようでした。 別の方法を模索してみます。ありがとうございました。
ikedas

2023/10/14 12:22

お役に立てず、残念でした、また質問してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問