【GameMaker Studio 2】サブスクしたのに反映されない?原因と解決策を解説

導入

GameMaker Studio 2では、WindowsやMas OS、Androidなど外部向けにコンパイルする際、自身のアカウントでサブスクリプションする必要があります。

大抵の場合、サブスクリプションが完了したあと、GameMaker Studioを再度開くと、直ぐに外部向けのコンパイルができるようになります。…しかし、自分の場合、同じ手順を行ってもサブスクが反映されませんでした。

最近(2021/8)になって、GameMaker Studio 2の購入システムが大きく変化したこともあり、昔のエラー情報を頼ることはできませんでした。また、GameMaker Communityに相談しても原因を突き止めることはできませんでした。

解決は困難を極めましたが、カスタマーサポートが遂に原因を突き止めてくれました。

原因を探すのが難しいにも関わらず、原因は多くの人にも当てはまる罠だった(コミュニティフォーラムに同じ問題を抱えていた人がいた)ので、これは絶対に共有すべきだと思い、この記事を書きました。

サブスクが反映されたか確かめる方法

自分が制作したゲームプロジェクトを開き、右上を見ます。「Test | Local | VM | Default | Default」などと書いてあると思いますが、一番左にある「Test」が「どのプラットフォームに向けてコンパイルするか」を表しています。

プラットフォームに「Test」があればサブスクは反映されておらず、逆に「Windows」や「Mac OS」、「Android」などがあればサブスクは反映されています。

解決策①

「File > Log out」を選択してログアウトし、そのあと再びログインする。

GameMakerを開いたままサブスクをした場合、サブスクの更新が行われていない恐れがある為です。

このサイトに同じことが書いてあります。

https://help.yoyogames.com/hc/en-us/articles/115001219911-How-To-Update-Your-License-To-See-Your-New-Purchase

解決策②

YoyoAccountの2段階認証を解除する。

これは私が陥っていた罠です。2段階認証を設定していると、サブスクが反映されなくなります。2段階認証を再設定すると、また使えなくなるので、2段階認証はバグが解消されるまでオフにしていた方がよさそうです。

解決策③

セキュリティがサブスクの更新を阻害している可能性があります。

https://help.yoyogames.com/hc/en-us/articles/360022953052-User-Permissions-and-Internet-Access-Required-by-GMS2

このサイトからいくつか分かりやすい例を挙げると、

  • ファイアーウォールが悪さをしている
  • ポート80と443が開いていない
  • クラウドのファイル同期によってファイルがロックされている
  • インターネットに繋がっていない
  • ファイルウォッチャーの不具合

解決策④

「他人を頼る」。筆者もこれによって解決することができました。

ゲームメーカーコミュニティーフォーラムを利用する。

アカウントを作成し、質問を投稿すると、皆が集まって解決策を提案してくれます。

https://forum.yoyogames.com/index.php

カスタマーサポートを利用する。

YoyoAccountにログインしてから以下のリンクを開いてください。開いたら、問題のカテゴリーを入力し、その問題が「すでに報告された問題」に含まれていないなら、「I STILL NEED TO REPORT A BUG」をクリック。その後、必要事項を記入。すると、アカウントのメールアドレスに「整理券が割り振られたので、問題の内容をメールに書いて送って下さい」という内容のメールが届きます。書いたメールを送ると、数時間後にカスタマーサポートが返信してくれます。私は最大で9時間待たされたので、中々返信が来なくてもめげないようにしましょう。

https://accounts.yoyogames.com/contact-us

【GameMaker Studio 2】直線と最初に衝突する物体を取得する

導入

collision_lineは(x1, y1)と(x2, y2)を結ぶ直線と衝突する物体のIDを返してくれますが、(x1, y1)に最も近い物体のIDを返すわけではありません。

「視点」の概念を導入するとき、(x1, y1)に最も近い物体のIDを返してくれたら便利です。悩んでいる人の為にも、その関数を作ることにしました。

※海外の人が既に同じ関数を作っていましたが、バージョンが異なっているし、コードが長めだったので、新規に作ることにしました。

コード

以下のコードを、「スクリプト」に突っ込んでおけば動きます。

(x1, y1)と(x2, y2)を結ぶ直線上にある全てのobjの内、(x1, y1)に最も近いobjのインスタンスIDを返します。

function collision_line_first(x1, y1, x2, y2, obj)
{
	var list_ = ds_list_create();
	
	collision_line_list(x1, y1, x2, y2, obj, false, true, list_, true);
	if (ds_list_size(list_) >= 1)
	{
		list_0 = list_[| 0];
		ds_list_destroy(list_)
		return list_0;
		
	}
	ds_list_destroy(list_);
	return noone;
}

※データリストがインスタンスであることに注意

使わなくなったds_listは自動的に捨てられるわけではないので、ds_list_createをしたあと、ds_list_destroyで必ずインスタンスを捨てる必要があります。

自分はその失敗をしてメモリを一瞬で喰われました…。

【GameMaker Studio 2】親オブジェクトの変数や関数を子オブジェクトで継承する方法

導入

オブジェクトの親オブジェクトを設定したとき、子オブジェクトの「Create」や「Step」は親オブジェクトと同じものに設定されます。

子オブジェクトの「Create」や「Step」を新たに作成すると、親オブジェクトの「Create」や「Step」は消えてしまい、変数や関数を継承できません。

じゃあどうすれば良いか?…その答えが見つかったので、それを共有したいと思います。

前提として

オブジェクトの「Parent」という欄でオブジェクトの親オブジェクトを設定することができます。

方法①(関数と変数を継承)

例えば「Create」に書かれている関数を継承したい場合、子オブジェクトに新しく「Create」を作り、その一行目に以下のコードを挿入する。

// 子オブジェクトの「Create」
event_perform_object(object_get_parent(object_index), ev_create, 0);

このコードは、親オブジェクトの「Create」を呼ぶコードです。このコードの下に処理を書いていけば、任意の変数や関数を変更することができます。

また、親オブジェクトの「Step」を呼びたいときは、ev_createをev_stepに変更すると良いです。

方法②(変数のみを継承)

親オブジェクトを開き、「VariableDefinition」を開きます。そして、「Name」 に変数の名前、「Type」に変数の型、「Default」に初期値を入れます。

次に、子オブジェクトの「VariableDefinition」を開き、変数の右にある「鉛筆マーク」をクリックすると、変数はオーバーライドされます。このとき、変数を初期値を独自に変更できるようになります。

また、オーバーライドを解除したいときは同じ場所を再度クリックすると良いです。