このツールは元々、Unityでシンプルなカジュアルゲームを開発するのに役立つように作成されていましたが、少なくともそこでは非常に便利でした。
でも、ユニットだけでなく、他のプロジェクトでも使うと思います。
そして、おそらく、それはあなたにも役立つでしょう!
ソースリンク
それで、彼は何のためですか?
状況を想像してみてください。1つのレベルを完了するために画面を10回タップする必要がある単純なカジュアルゲームを作成し、プレビューのために上司(または甘やかされて育った顧客)に送信しました。
タスクが1つずつ続きます:
- 1.5分ごとにフィニッシュに広告を追加しましょう。
- そして、最初のどこかに「広告がないようにプレミアムを購入する」というウィンドウが表示されます。
- チェ、このウィンドウは強く押しますが、広告の後で、プレーヤーがスタートを押して2つのレベルを通過したときだけにしますか?
- そして、10、20、30レベルで、「友達と共有」ウィンドウが表示されますか?
- そして、レベル10から2レベルごとに「Rateus!」というウィンドウが表示されますか?
- そしてもっとたくさん!
残忍な実行と無限のブロックを経て、ウィンドウの位置の100回目のチェックを実行した後でも、遅かれ早かれ、そのような問題に直面します。タイマーに関連付けられたウィンドウは、レベル自体に関連付けられたウィンドウとオーバーラップする可能性があります。
これをやり直すのはますます難しくなります-結局のところ、条件付きチェックはすでに首にかかっています、そしてあなたの同僚は完全に読めないコードで彼自身のウィンドウを追加することができます!何をすべきか?
仕事
特定の時点(ボタンを押すなど)で、指定されたすべての条件が満たされた場合(時間が経過した、必要なポイントに達した場合など)にのみウィンドウを呼び出します。
決定
このために、Conditionクラスを作成しました。主なフィールドは次のとおりです。
- timer int setedSeconds
- intsetedSkipsをスキップします
- List <int> checkPoints
, , . .
, , . , , , NextSkip(). = 0, ,
. - , START() — .
, StartTimer() ResetSkips(). , IsReady()
true , (value > 0), START() .
: — ( ) setedSeconds, , , !
IsReady() , START() , , .
public Condition myCondition;
void Start(){
myCondition = new Condition("");
myCondition.setedSeconds = 120; // 2
myCondition.setedSkips = 5;
myCondition.START(); //
}
//
public void FinishRound(){
myCondition.NextSkip(); // ,
if (myCondition.IsReady())
{
// , ...
myCondition.START(); // START() . , IsReady == true
}
}
, , — List <int> checkPoints. - , , , ., , - . , : , ( , ). , Sheduler , , — .
public Condition myCondition;
void Start(){
myCondition = new Condition("",new List<int> { 1, 2, 5 }); // ,
myCondition.setedSeconds = 120;
myCondition.setedSkips = 5;
myCondition.START();
}
public void FinishRound(){
myCondition.NextSkip();
if (myCondition.IsReady() || myCondition.HasCheckPoint(currentLevel)) //
{
// , ...
myCondition.START();
}
}
, , =) AutoInvoke(Action CallBack, int checkPoint = 0) , NextSkip() START() , START() .
public Condition myCondition;
void Start(){
myCondition = new Condition("",new List<int> { 1, 2, 5 });
myCondition.setedSeconds = 120;
myCondition.setedSkips = 5;
myCondition.START();
}
public void FinishRound(){
myCondition.AutoInvoke(() => Debug.Log("hello World"), currentLevel);
// currentLevel,
}
1つの条件オブジェクトは、任意の1つの機能の操作に必要な条件のセットをすばやく提供するのに役立ちます!!!
TKでのタスクが単純な呼び出しよりも少し難しい場合、たとえば、1回おきに、またはしばらくしてから呼び出す場合、これは抽象化と読みやすさであるため、条件に頼るのはすでに便利です。起動して準備ができているかどうかを確認するだけです。
インスペクターで簡単に初期化できるように、条件フィールドに便利なユニット属性を追加しました。
主なものは柔軟性であり、突然誰かがあなたの状態と矛盾してはならない独自の機能を思いついた場合、あなたはただ一般的なプランナーを作成する必要があります...
次のタスク
プログラムのさまざまな場所からさまざまなウィンドウ(関数呼び出し)を柔軟に追加し、同期を保ち、オーバーレイの競合を回避します!
解決策:
そして今、私たちはメインのシェデュラークラス、私たちのコンディションプランナーに着きました!
このクラスのオブジェクトはできるだけ早く初期化することをお勧めします。特にユニットでは、オブジェクトはDontDestroyOnLoadである方が適切です。Shedulerの
内部を見ると、次のフィールドが表示されます。
- 現在のチェックポイントintcurrentheckPoint
- 追加されたすべての条件とその行動の集合辞書&ltCondition、アクション&GT ConditionHandlersように-
プランナーは、完成状態が果たすべきどのような役割を知っています - Dictionary <int,Condition> CheckPoints — Sheduler, Dictionary, , . .
- Queue <Condition> WaitingConditions ,
Shedulerは各条件の動作を保存し、このクラスに従って機能します。これは、条件public void Add(Condition newCondition、Action CallBack)を追加するときに設定され、引数には必要なデリゲートがあります。メソッド自体が条件名を読み取り、それが空であるかすでに追加されている場合は例外をスローします。これは、何らかの理由でList&ltCondition&gt GetConditions(params string [] conditionName)という名前のスケジュールから条件を取得する必要がある場合に必要です。また、addメソッドAdd ()は、追加された条件のStart()をすぐに実行します。これは、Start()を実行する場合に役立ちます。追加された条件は、どの開発者によっても忘れられます。また、Shedulerからこの関数が絶えずスローされるのを避けるためです。条件を開始するために別の場所が必要な場合は、以前と同じように条件を操作するだけで、いつでもそのカウンターを変更できます。これがShedulerの美しさです。条件の準備ができている場所と準備が変更されている場所を処理し、メインメソッドのCondition Invoke(params Condition []バッジ)を呼び出すときにこの計算を行います。引数では、特定のバッジ、つまり、排他的に機能する必要がある条件と、順番が来たがバッジのリストに表示されなかった条件を指定できます。その場合、それらは機能しません。しかし、何も指定しないと、当然のことながら、誰もがキューのピーク時に電話をかける権利があります。
Sheduler NextCheckPoint()のチェックポイントがカウントされる場所を必ず考えてください。たとえば、メソッド、ラウンドの終了時、またはラウンドの開始時に、
Shedulerを操作するために必要なものの完全な例を示します。
public Condition OfferBuyVip;
public Condition OfferToShareWithFriends;
public Condition OfferToVisitSite;
public Sheduler OfferSheduler;
public void Start(){
OfferSheduler = new Sheduler(currentLevel); //
/*
*
*/
OfferSheduler.Add(OfferBuyVip, () => Debug.Log(" VIP"));
OfferSheduler.Add(OfferToShareWithFriends, () => Debug.Log(" "));
OfferSheduler.Add(OfferToVisitSite, () => Debug.Log(" , "));
}
public void FinishRound(){
OfferSheduler.NextCheckPoint(currentLevel); // ,
OfferSheduler.Invoke(OfferBuyVip, OfferToShareWithFriends) // ,
}
public void StartRound(){
OfferSheduler.Invoke(OfferToVisitSite); //
// , , Sheduler
}
このようにして、条件の3つの機能が異なる場所で呼び出され、それらは互いに尊重し、すべてをクロールするのではなく、キュー(クーポンの最新のデジタルキューのように)とユーザーを観察し、フィニッシュラインからゲームの開始にすばやくジャンプすることを達成しました。 、提案の数から負担をかけません。 Shedulerを使用すると、単純さと柔軟性の明確な調和が維持されます。これは、Shedulerと、Add(Condition newCondition、Action CallBack)メソッドを介して渡されたデリゲートを使用すると、ウィンドウ間の任意の接続を実装できるためです。
たとえば、広告バナーを呼び出すと、広告なしでプレミアムを購入するオファーが2つのレベルの後に表示されます。
void Start(){
OfferSheduler = new Sheduler(currentLevel);
callAddBanner = new Condition(" ");
callAddBanner.setedSeconds = 80; // 80
OfferBuyVip = new Condition(" VIP ");
OfferSheduler.Add(callAddBanner,
delegate()
{
Debug.Log(" ");
OfferBuyVip.setedSkips = 2; //
OfferBuyVip.START(); //
}
);
OfferSheduler.Add(OfferBuyVip,
delegate ()
{
Debug.Log(" VIP");
OfferBuyVip.setedSkips = 0; // !
//,
}
);
}
void Finish(){
OfferSheduler.NextCheckPoint(currentLevel); //
//
OfferSheduler.Invoke(); //
//
}
そのように、今では80秒ごとに気を散らさない広告がトリガーされ(結局のところ、重要なラウンドではなくフィニッシュラインで呼び出されます)、都合の良いときに広告を購入するオファーを呼び出します!そして最高のことは、チーム内のすべての開発者が提案をShedulerに追加できるようになり、Shedulerがすべてを配布することです。