Flashゲーム講座 & アクションスクリプトサンプル集

 

共有オブジェクトについて

 


■共有オブジェクトについて

 
共有オブジェクトは、記憶領域(ストレージ)の一種です。
 
SharedObject を使用すると、データをローカル環境に保存する事ができます。
 
■保存可能なデータ型について
 
保存できるのは、Boolean、Number、String、Array、Object 型などです。
 
■シリアライズ後のフォーマットについて
 
フォーマットは、Action Message Format (AMF0) 形式です。
 
ファイルの拡張子は、「.sol」となります。
 
ActionScript3.0 では、AMF 形式の読み書きに対応しています。
 
■ .sol ファイルの保存場所について
 
ハードディスク内を、"SharedObjects" や "*.sol" などで検索します。
 
Windows XP の場合

C:\Documents and Settings\[ユーザー名]\Application Data\Macromedia\Flash Player\#SharedObjects\
 
Windows 7 の場合

C:\Users\[ユーザー名]\AppData\Roaming\Macromedia\Flash Player\#SharedObjects\
 
■ユーザーによる共有オブジェクトの管理について
 
ブラウザによっては、Cookie を削除すると、共有オブジェクトも連動して削除されます。
 
Flash Player の設定から、共有オブジェクトを削除する事もできます。
 

■ Macromedia Flash 5 でも作成可能

 
共有オブジェクトは、Flash Player 6 以降で利用可能です。
 
Flash Player 6 以降の環境であれば、Flash 5 形式の swf ファイルでも動作します。
 
 

 

共有オブジェクトを作成する

 

サンプルをダウンロード
 


■共有オブジェクトを作成する

 
共有オブジェクトを作成するにば、SharedObject.getLocal() メソッドを使用します。
 
保存データが既に存在する場合、読み込み処理も同時に行われます。
 
SharedObject.getLocal( "名前" , "ローカルパス" , セキュア? ) :SharedObject
第01引数 String共有オブジェクト名を指定
第02引数(略可)Stringローカルパスを指定(共有範囲)
第03引数(略可)Boolean[Flash 8 以降] セキュア専用の共有オブジェクトを作成するなら true を指定
戻り値 VoidSharedObject オブジェクトが得られる。引数に不備がある場合は null
 
■作成例
 
共有オブジェクトを作成する

// 共有オブジェクトを作成する
var shared_obj = SharedObject.getLocal("my_data");
 
ドメイン内のすべての Flash からアクセス可能な共有オブジェクトを作成する

// 共有オブジェクトを作成する
var shared_obj = SharedObject.getLocal("my_data" , "/");
 
■第01引数 共有オブジェクト名
 
『 ? % & \ ; : " ' , < > ? # 』などの記号を含める事はできません。
 
「名前.sol」というファイル名で、実際にローカルに保存されます。
 
■第02引数 ローカルパス(共有範囲)
 
ストレージの共有については、こちらで解説しています。
 
ドメイン名を除いた、ファイルパスを指定します。
 
自身の格納場所から、URL を、ディレクトリ単位で削ります。
 
例えば、「http://example.com/aaa/bbb/ccc/my.swf」は、以下の指定が可能です。
 
http://example.com/aaa/bbb/ccc/my.swf で動作している場合

SharedObject.getLocal( "my_data" , "/aaa/bbb/ccc/my.swf" );
SharedObject.getLocal( "my_data" , "/aaa/bbb/ccc" );
SharedObject.getLocal( "my_data" , "/aaa/bbb" );
SharedObject.getLocal( "my_data" , "/aaa" );
SharedObject.getLocal( "my_data" , "/" );
 
■第03引数 セキュア (Flash 8 以降で動作)
 
自身がセキュア(https) な環境である場合に設定します。
 
true を指定すると、セキュア専用の共有オブジェクトを作成します。
 
これにより、アンセキュア(http) な環境との共有を拒絶します。
 
false を指定すると、通常の共有オブジェクトを作成します。
 
デフォルトは false です。
 
自身がアンセキュア(http) な環境である場合に、true を指定すると失敗します。
 

■ストレージの共有について

 
自身が作った共有オブジェクトは、別の Flash からもアクセスできます。
 
■デフォルトの動作について
 
デフォルトでは、ストレージは共有されません。
 
ストレージは、URL 単位で隔離されています。
 
例えば、ファイル名を変更すると、元の共有オブジェクトにはアクセスできなくなります。
 
■クロスドメインのセキュリティについて
 
別のドメインとストレージを共有する事はできません。
 
解除する方法もありません。
 
■共有範囲の設定について(ローカルパスの設定)
 
getLocal() メソッドの第02引数から、ローカルパスを指定します。
 
ローカルパスを含む、すべての Flash に対して、自身との共有を許します。
 
例えば、"/aaa/bbb" と記述した場合、
 
「http://example.com/aaa/bbb/my.swf」や
 
「http://example.com/aaa/bbb/other.swf」や
 
「http://example.com/aaa/bbb/ccc/other.swf」や
 
「http://example.com/aaa/bbb/ccc/ddd/other.swf」などは、
 
同じ共有オブジェクトにアクセスできるようになります。
 
■グローバルな共有オブジェクトについて
 
"/" の指定は、最大のセキュリティリスクがあります。
 
ドメイン内のすべての Flash に対して、自身との共有を許します。
 
■ローカル環境の場合
 
ローカル環境にある Flash は、"localhost" というドメイン名で管理されます。
 
ローカルで実行される、すべての Flash は、ストレージを共有できる可能性があります。
 
 

 

共有オブジェクトにデータを保存する

 
 


■共有オブジェクトにデータを書き込む

 
data プロパティを使用します。
 
data プロパティの中身は、コレクション用のオブジェクトです。
 
ドットアクセス演算子配列アクセス演算子を使って、プロパティを追加します。
 
キーをセットにして、個別にデータを保存する事ができます。
 
共有オブジェクトにデータを書き込む

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む(ドットアクセス演算子の場合)
	// ------------------------------------------------------------
	shared_obj.data.key0 = "書き込みテスト";
	shared_obj.data.key1 = 123456;
	shared_obj.data.key2 = ["a","b","c","d","e"];
	shared_obj.data.key3 = { a:0 , b:1 , c:2 };

	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む(配列アクセス演算子の場合)
	// ------------------------------------------------------------
	shared_obj.data["添字0"] = "書き込みテスト";
	shared_obj.data["添字1"] = 123456;
	shared_obj.data["添字2"] = ["a","b","c","d","e"];
	shared_obj.data["添字3"] = { a:0 , b:1 , c:2 };

	// ------------------------------------------------------------
	// 共有オブジェクトをフラッシュする
	// ------------------------------------------------------------
	shared_obj.flush();

}
 
■リファレンス型データの保存に注意
 
Array や Object 型は、まとめて保存ができるので便利です。
 
これらの書き込みを行った場合、データはコピーされません。
 
実態は参照渡しなので、常に保存の対象となる状態に陥ります。
 
保存処理を行った後で、リファレンス型データの中身を変更すると、ストレージにも反映されてしまいます。
 
リファレンス型データの保存に注意

// ------------------------------------------------------------
// 保存用のオブジェクト
// ------------------------------------------------------------
var save_obj = {
	aaa:"保存データA",
	bbb:"保存データB",
	ccc:"保存データC"
};

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む(実態はコピーではなく参照渡し)
	// ------------------------------------------------------------
	shared_obj.data.key = save_obj;

	// ------------------------------------------------------------
	// 共有オブジェクトをフラッシュして、参照を断つ(ここで一連の処理は完了したかのように見える)
	// ------------------------------------------------------------
	shared_obj.flush();
	shared_obj = null;

	// ------------------------------------------------------------
	// この変更はストレージにも反映されてしまう(共有オブジェクトから参照されているため)
	// ------------------------------------------------------------
	save_obj.aaa = "更新A";
	save_obj.bbb = "更新B";
	save_obj.ccc = "更新C";
}
 
■リファレンス型データを複製してから保存する
 
参照を断ち切るには、リファレンス型データを複製します。
 
オブジェクトの複製については、こちらで解説しています。
 

■共有オブジェクトをフラッシュする

 
ローカルへの書き込みは、すぐに実行されるとは限りません。
 
Flash が消滅する直前などのタイミングで、まとめて実行されるでしょう。
 
ローカルへの書き込みを今すぐ実行するには、flush() メソッドを使用します。
 
戻り値から、フラッシュに成功したかを知る事ができます。
 
確認ダイアログを表示したくない場合は、このメソッドは使用しません。
 
SharedObject.flush( 保存サイズ ) :Object
第01引数(略可)Numberユーザーに要求する保存サイズを指定。
戻り値 Object結果が得られる
 
■第01引数 保存サイズ
 
ユーザーに要求する保存サイズを指定します。
 
指定したサイズや、実際に書き込まれるサイズが、ユーザーの設定によって制限されているバイト数を超える場合は、確認用のダイアログが表示されます。
 
確認用ダイアログは、非同期的に実行されます。
 
この結果を取得するには、onStatus イベントを使用します。
 
 
■戻り値 結果
 
以下の値が得られます。
 
ハードディスクへの書き込みは、同期的に実行されます。
 
説明
trueBooleanローカルへの書き込みが成功した。
falseBooleanローカルへの書き込みが失敗した。ユーザーが許可していない場合など。
"pending"Stringユーザーに確認用のダイアログを表示した。(結果は onStatus イベントで取得)
 
■使用例
 
共有オブジェクトをフラッシュする

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む
	// ------------------------------------------------------------
	shared_obj.data.key0 = "書き込みテスト";
	shared_obj.data.key1 = 123456;
	shared_obj.data.key2 = ["a","b","c","d","e"];
	shared_obj.data.key3 = { a:0 , b:1 , c:2 };

	// ------------------------------------------------------------
	// 共有オブジェクトをフラッシュする
	// ------------------------------------------------------------
	var result = shared_obj.flush();

	// ------------------------------------------------------------
	// フラッシュの結果
	// ------------------------------------------------------------
	switch(result){
	case "pending":
		trace ("ユーザーに確認用のダイアログを表示した");
		break;
	case true:
		trace ("ローカルへの書き込みが成功した");
		break;
	case false:
		trace ("ローカルへの書き込みが失敗した");
		break;
	}

}
 

■確認用のダイアログの結果を取得する

 
確認用ダイアログの結果を取得するには、onStatus イベントを使用します。
 
コールバック関数の引数から、情報オブジェクトが得られます。
 
情報オブジェクトの code プロパティから、以下の文字列が得られます。
 
code プロパティ説明
"SharedObject.Flush.Success"ユーザーが許可したので、flush() は成功した
"SharedObject.Flush.Failed"ユーザーが拒否したので、flush() は失敗した
 
onStatus イベントを使って、確認用ダイアログの結果を取得する

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 確認ダイアログの結果を取得するイベント
	// ------------------------------------------------------------
	shared_obj.onStatus = function (info){
		switch(info.code){
		case "SharedObject.Flush.Success":
			trace("ユーザーが許可したのでフラッシュは成功した");
			break;
		case "SharedObject.Flush.Failed":
			trace("ユーザーが拒否したのでフラッシュは失敗した");
			break;
		}
	};

	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む
	// ------------------------------------------------------------
	shared_obj.data.key0 = "書き込みテスト";
	shared_obj.data.key1 = 123456;
	shared_obj.data.key2 = ["a","b","c","d","e"];
	shared_obj.data.key3 = { a:0 , b:1 , c:2 };

	// ------------------------------------------------------------
	// 共有オブジェクトをフラッシュする
	// ------------------------------------------------------------
	var result = shared_obj.flush();

	// ------------------------------------------------------------
	// フラッシュの結果
	// ------------------------------------------------------------
	switch(result){
	case "pending":
		trace ("ユーザーに確認用のダイアログを表示した");
		break;
	case true:
		trace ("ローカルへの書き込みが成功した");
		break;
	case false:
		trace ("ローカルへの書き込みが失敗した");
		break;
	}

}
 

■設定ダイアログを開く表示する(ローカル記憶領域用)

 
System.showSettings() メソッドを使用します。
 
ローカル記憶領域の設定を開くには、引数に 1 を指定します。
 
ローカル記憶領域用の設定ダイアログを開く

// ローカル記憶領域用の設定ダイアログを開く
System.showSettings(1);
 
 

 

共有オブジェクトからデータを取得する

 
 


■共有オブジェクトからデータを取得する

 
data プロパティを使用します。
 
data プロパティの中身は、コレクション用のオブジェクトです。
 
ドットアクセス演算子配列アクセス演算子を使って、読み取りアクセスします。
 
共有オブジェクトに書き込んだデータを取得する

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む(ドットアクセス演算子の場合)
	// ------------------------------------------------------------
	shared_obj.data.key0 = "書き込みテスト";
	shared_obj.data.key1 = 123456;
	shared_obj.data.key2 = ["a","b","c","d","e"];
	shared_obj.data.key3 = { a:0 , b:1 , c:2 };

	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む(配列アクセス演算子の場合)
	// ------------------------------------------------------------
	shared_obj.data["添字0"] = "書き込みテスト";
	shared_obj.data["添字1"] = 123456;
	shared_obj.data["添字2"] = ["a","b","c","d","e"];
	shared_obj.data["添字3"] = { a:0 , b:1 , c:2 };

	// ------------------------------------------------------------
	// 共有オブジェクトをフラッシュする
	// ------------------------------------------------------------
	shared_obj.flush();
	shared_obj = null;
}


// ------------------------------------------------------------
// 共有オブジェクトを作成する(保存データが存在する場合、読み込み処理も同時に行われる)
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトからデータを取得する(ドットアクセス演算子の場合)
	// ------------------------------------------------------------
	var value0 = shared_obj.data.key0;
	var value1 = shared_obj.data.key1;
	var value2 = shared_obj.data.key2;
	var value3 = shared_obj.data.key3;

	// ------------------------------------------------------------
	// 共有オブジェクトからデータを取得する(配列アクセス演算子の場合)
	// ------------------------------------------------------------
	var value4 = shared_obj.data["添字0"];
	var value5 = shared_obj.data["添字1"];
	var value6 = shared_obj.data["添字2"];
	var value7 = shared_obj.data["添字3"];

}
 
■リファレンス型データの読み取りに注意
 
Array や Object 型は、まとめて保存ができるので便利です。
 
これらの読み取りを行った場合、データはコピーされません。
 
実態は参照渡しなので、常に保存の対象となる状態に陥ります。
 
取得した、リファレンス型データの中身を変更すると、ストレージにも反映されてしまいます。
 
リファレンス型データの取得に注意

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む
	// ------------------------------------------------------------
	shared_obj.data.key = {
		aaa:"保存データA",
		bbb:"保存データB",
		ccc:"保存データC"
	};

	// ------------------------------------------------------------
	// 共有オブジェクトをフラッシュする
	// ------------------------------------------------------------
	shared_obj.flush();
	shared_obj = null;
}


// ------------------------------------------------------------
// 共有オブジェクトを作成する(保存データが存在する場合、読み込み処理も同時に行われる)
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトからデータを取得する(実態はコピーではなく参照渡し)
	// ------------------------------------------------------------
	var save_obj = shared_obj.data.key;

	// ------------------------------------------------------------
	// 共有オブジェクトの参照を断つ(ここで一連の処理は完了したかのように見える)
	// ------------------------------------------------------------
	shared_obj = null;

	// ------------------------------------------------------------
	// この変更はストレージにも反映されてしまう(共有オブジェクトから参照されているため)
	// ------------------------------------------------------------
	save_obj.aaa = "更新A";
	save_obj.bbb = "更新B";
	save_obj.ccc = "更新C";
}
 
■リファレンス型データを複製する
 
参照を断ち切るには、リファレンス型データを複製します。
 
オブジェクトの複製については、こちらで解説しています。
 

■共有オブジェクトからデータをすべて取得する

 
for..in 文を使用します。
 
共有オブジェクトからデータをすべて取得する

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// コレクション用オブジェクトを取得する
	// ------------------------------------------------------------
	var data = shared_obj.data;

	// ------------------------------------------------------------
	// データをすべて取得する
	// ------------------------------------------------------------
	var key;
	for(key in data){
		// 値を取得
		var value = data[key];

		// 出力テスト
		trace('key:"' + key + '" value:' + value);
	}

}
 

■共有オブジェクトの現在のバイトサイズを取得する

 
getSize() メソッドを使用します。
 
sol ファイルに保存する、ファイルサイズに相当します。
 
SharedObject.getSize( ) :Number
引数 Voidなし。
戻り値 Number共有オブジェクトの現在のバイト数が得られる
 
共有オブジェクトの現在のバイトサイズを取得する

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトを削除する
	// ------------------------------------------------------------
	shared_obj.clear();

	// ------------------------------------------------------------
	// 共有オブジェクトの現在のバイト数を取得する
	// ------------------------------------------------------------
	var byte_size0 = shared_obj.getSize();

	// 出力テスト
	trace(byte_size0); // 0


	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む
	// ------------------------------------------------------------
	shared_obj.data.key0 = "書き込みテスト";
	shared_obj.data.key1 = 123456;
	shared_obj.data.key2 = ["a","b","c","d","e"];
	shared_obj.data.key3 = { a:0 , b:1 , c:2 };

	// ------------------------------------------------------------
	// 共有オブジェクトの現在のバイト数を取得する
	// ------------------------------------------------------------
	var byte_size1 = shared_obj.getSize();

	// 出力テスト
	trace(byte_size1); // 173
}
 
 

 

共有オブジェクトからデータを削除する

 
 


■共有オブジェクトからデータを削除する

 
data プロパティを使用します。
 
data プロパティの中身は、コレクション用のオブジェクトです。
 
delete 演算子を使って、プロパティを削除します。
 
すべて削除した場合、ローカルに保存されていた sol ファイルも削除されます。
 
共有オブジェクトからデータを削除する

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトにデータを書き込む
	// ------------------------------------------------------------
	shared_obj.data.key0 = "書き込みテスト";
	shared_obj.data.key1 = 123456;
	shared_obj.data.key2 = ["a","b","c","d","e"];
	shared_obj.data.key3 = { a:0 , b:1 , c:2 };

	// ------------------------------------------------------------
	// 共有オブジェクトをフラッシュする
	// ------------------------------------------------------------
	shared_obj.flush();
	shared_obj = null;
}


// ------------------------------------------------------------
// 共有オブジェクトを作成する(保存データが存在する場合、読み込み処理も同時に行われる)
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトからデータを削除する(プロパティを削除する)
	// ------------------------------------------------------------
	delete (shared_obj.data.key0);
	delete (shared_obj.data.key1);
	delete (shared_obj.data.key2);
	delete (shared_obj.data.key3);

	// ------------------------------------------------------------
	// 共有オブジェクトをフラッシュする
	// ------------------------------------------------------------
	shared_obj.flush();
	shared_obj = null;
}
 

■共有オブジェクトを削除する

 
共有オブジェクトを削除するには、clear() メソッドを使用します。
 
ローカルに保存されていた sol ファイルも削除されます。
 
SharedObject.clear( ) :Void
引数 Voidなし。
戻り値 Voidなし。
 
共有オブジェクトを削除する

// ------------------------------------------------------------
// 共有オブジェクトを作成する
// ------------------------------------------------------------
var shared_obj = SharedObject.getLocal("my_data");
if(shared_obj){

	// ------------------------------------------------------------
	// 共有オブジェクトを削除する
	// ------------------------------------------------------------
	shared_obj.clear();

}