4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Linuxで原神やるぞ!

Last updated at Posted at 2023-07-28

前提

先日『LinuxでWindowsアプリケーションを動かす』という記事を書きました

こちらの記事はLinuxで原神をプレイしたいというところから発展したものでした
原神のインストールは上記の記事にある流れで同様にインストールができます

原神を起動するのに都度Steamを立ち上げたくない

こちら本題となります

シェルスクリプトにまとめたい

シェルスクリプト叩いて実行できれば楽じゃないですか?
やりましょう

実行ファイルを調べる

まず動かしてみるのは当然Steamに登録してあるパスです
こいつを叩いてみます

image.png
動きませんね……

一旦立ち上げてからプロセスを確認してみます
image.png

これを叩いてみます
image.png

動かないですね……

ただこの長いコマンドによって起動することはわかりました

環境変数が必要

結論としては環境変数をセットしてやる必要があります

一度Steamから起動して動いてるプロセスが持っている環境変数を調べられればそいつをexportしてから実行することで動作することが期待されます

丁度こちらに特定のプロセスが持つ環境変数を取得する方法が記載されてますね👀

プロセスIDを特定する

ps auxf | grep "Genshin Impact"

これで一番親になってるプロセスIDを確認しましょう

今回 2645969 となってました
また、そのプロセスのコマンドラインも今一度確認しておきましょう

さて、上記記事にあるスクリプトを利用して環境変数を確認してみます

process-env 2645969

何やら色々出てきます
原神を起動する際に不要なものもありますが、とりあえず全部使いましょう

シェルスクリプトにまとめる

ここまでで実行ファイルのパスと環境変数がわかりました
これを愚直にシェルスクリプトにまとめましょう

こんな感じ.sh
#!/bin/bash

export 環境変数
export 環境変数
.
.
.
export 環境変数

/path/to/bootcmd

実行権限を付与してターミナルから実行してみると原神が起動するようになったかと思います

いろいろとめんどい

わかります
面倒ですよね

なのでゲームを起動するシェルスクリプトを吐き出すシェルスクリプトを用意いたしました
コマンドライン引数にはプロセスを特定するための文字列を指定します
"プロセスIDを特定する" でgrepした文字列で良いでしょう

steam-app
#!/bin/bash

echo "#!/bin/bash"
echo

ROOTPROCESS=$(ps auxf | grep "$(pgrep -f "$1")" | head -n1 | awk '{ print $2 }')
process-env $ROOTPROCESS | while read line; do
  echo "export ${line}"
done

CMDLINE="$(ps aux | grep ${ROOTPROCESS} | grep -v grep | awk '{ for (i=13; i<=NF; i++) printf("%s ", $i) }')"

echo "$(cat <<SHELLSCRIPT

function signal() {
  kill -KILL \$(ps aux | grep "$1" | grep -v grep | awk '{ print \$2 }')
}

trap "signal" SIGINT SIGHUP SIGKILL SIGTERM

${CMDLINE} > /dev/null 2>&1

SHELLSCRIPT
)"

まずシェバンを出力します
次にprocess-envを用いて取得した環境変数を反映させるためにexportする形で出力します

起動するためのコマンドラインを取得します

次にヒアドキュメントを使ってなにやらやっています
これはちょっと込み入った記述をするのに都度echoするのが面倒だったのでこうしてます

まずシグナルを受けとった際に実行する関数を定義します
これはプログラムを終了させるのに利用します
次にtrapを用いてシグナルを受け取った際に関数が呼び出されるようにします
ゲームのウィンドウを閉じるだけだとプロセスが完全には終了しませんでした

こうしておくとターミナルから起動していればCtrl+CでKILLできますし、そうでなければ適宜起動したシェルスクリプトのプロセスに対してKILLしてやればいい感じにゲームのプロセスも死ぬようになります

最後に先程抽出したコマンドラインを出力します

一度Steamでゲームを起動した状態でこのスクリプトを実行して結果をリダイレクトし、そのファイルに実行権限を付与して実行します

キタ―――(゚∀゚)―――― !!

image.png
image.png

ちなみにゲームパッドも認識してコントローラー握りしめて遊んでます


それでは良いゲームライフを

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?