読者です 読者をやめる 読者になる 読者になる

宴3 メモ 途中

5.6p2になって、ようやく宴3を使った。

utage3.0.7
宴の公式を見るとたくさん情報がある。
公式のチュートリアルを終えたらリファレンス、マニュアルに目を通す。

エクセル持っていない人は無料で表計算できるソフトのLibreOfficeExcelの代用可能。

メモ
tool->Utage->new projectにて作成

f:id:gamemaker98:20170428105227p:plain

EngineにhierarchyにあるadvEngineを指定。
ScenariioLabelには最初に読み込むシート名を記入。

表示したい文章はTextに書いていきます。

選択肢 select

f:id:gamemaker98:20170428105659p:plain

選択肢のときに文字を出したい場合、PageCtrlにInput等を書く

CommandにSelectionやJump先のラベルを書く。(ラベルは*をつける)



変数:Paramシートに追加していく。

f:id:gamemaker98:20170428110701p:plain


   Label 名前
   Type 型 (Int,Float...)

           Value 値

paramTbl:

f:id:gamemaker98:20170428105034p:plain

使用

f:id:gamemaker98:20170428105358p:plain

 unityとの連携。
SendMessage、SendMessageByName

Unityと連携して拡張する | Unity用ビジュアルノベルツール「宴」
シナリオの終了

Unity用ビジュアルノベルツール「宴」 » 会話シーンを、途中で強制中断する方法について

 コメントアウト
列の名前先頭2文字に//をつける  //Voice

行の先頭に//をつける //Jump  //

ラベル *
ローカルラベル **  シート毎のラベル。

コマンド一覧 | Unity用ビジュアルノベルツール「宴」

テキスト表示 | Unity用ビジュアルノベルツール「宴」

宴 自分用

 というか、自分用の宴のサイトに合ったチュートリアルのリンクを貼っただけ。
暇見て追加したい。

 

madnesslabo.net

madnesslabo.net

----------------------   pause   ---------------------------------

using Utage;

public class TalkPause : MonoBehaviour {

AdvEngine Engine { get { return engine ?? (engine = FindObjectOfType<AdvEngine>()); } }
public AdvEngine engine;
public string scenarioLabel1;
public void TalkScenario()
{
StartCoroutine( CoTalk(scenarioLabel1) );
}

IEnumerator CoTalk(string scenarioLabel)
{
engine.JumpScenario( scenarioLabel );

while(!engine.IsPausingScenario)
{
yield return 0;
}

}
}

 

-----------------------   resume   ---------------------------
using Utage;

public class TalkResume : MonoBehaviour {

AdvEngine Engine { get { return engine ?? (engine = FindObjectOfType<AdvEngine>()); } }
public AdvEngine engine;

public void TalkResumeScenario()
{
engine.ResumeScenario();
}

}

2D スプライト 俺メモ

シーンのリロード
using UnityEngine.SceneManagement;
if (Input.GetKeyDown(KeyCode.R)){
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}


徐々に向く

public static Quaternion lookat2dspeed(GameObject targetgo, GameObject mygo,float speed){
Vector3 vec = (targetgo.transform.position - mygo.transform.position).normalized;
float targetang = Mathf.Atan2(vec.y, vec.x) * Mathf.Rad2Deg;
return Quaternion.RotateTowards(mygo.transform.rotation, Quaternion.Euler(0,0, targetang), speed * Time.deltaTime);

}

unityアセット ScriptInspector3

unityのインスペクタを使ってコードを書けるアセットinspector3について書きます。

 

un

f:id:gamemaker98:20161219171807j:plain

unityでスクリプトを書くときにはvisualstudioやmonodevelop等でコードを書いていると思いますが、連携といっても別のソフトを立ち上げてやり取りするのはきついです。
とくにモニタが一つだけだと大変です。

script inspector3はこのようにunityのインスペクタで直接コードを修正できます。

コードをダブルクリクするとフローティングウインドウで開いて編集できます。

コードの補完などできます。
セーブするとコンパイラが走ります。

ちょこちょこコードを修正するのに効率アップします。
ということで僕はいつもinspector3で作業しています。

ーーーーーーーーー
タブやら分割やらも対応しています。

f:id:gamemaker98:20161219173458j:plain


更新について、2016/12現在もバージョンアップしています。
5.5で using unityengine.UIが認識しないトラブルがあったのですが、製作者さんに臨時対応を教えてもらいました。
対応方法
UIのコードを書く。エラーがでてもいいので、コード上でUIエレメントを通常通りに作ってセーブしてコンパイラする。
そうすると using Unityengin.UIが認識するようになる。
ーーーーーーーーー
using UnityEngine.UI;を書いて
private Text debugtext;こんなふうにエレメントを作る。後はセーブしてコンパイラ
debugtext = GameObject.Find("DebugText").GetComponent<Text>();

現在修正パッチを作っていてもうすぐとのことです。


2015年のアセットファイナリストにもなったアセットなので安心して使うことができます。

あれのベータのサンプル学習メモ

ベータのサンプルをコピペ用にメモ
(ベータなので仕様変更があるかもしれないのであまりかかない)

テンプレのプラットフォームサンプルを読み込んだ。
roomのタイル情報を読み込んで、オブジェクト毎のあたり判定をチェックしている方式を使っていた。

oGameオブジェクト
create
map = layer_tilemap_get_id("Collisions"); // コリジョンレイヤのタイルマップ情報を読み込む
hills = layer_get_all_elements("Hills");  Hillアセットレイアのアセット情報を読み込む。

switch(room){ ルームによりスプライトを置き換えていくコード。
 case rSand: // if we are in the sand room
  for(i=0;i<array_length_1d(hills);i++){
   if(layer_sprite_get_sprite(hills[i]) == sBGHills_grass){ 
   layer_sprite_change(hills[i],sBGHills_sand);

step
アセットを移動する

layer_sprite_x(clouds[i], layer_sprite_get_x(clouds[i])+1);
if(layer_sprite_get_x(clouds[i]) > room_width){ 画面外だったら左端に横幅分左に移動
layer_sprite_x(clouds[i],-sprite_get_width(layer_sprite_get_sprite(clouds[i])));

draw
draw_sprite(sPickupStar,0,view_wport[0]-50,50); 
draw_text(view_wport[0]-20-sprite_get_width(sPickupStar),57,score);

//-------------------------------------------------------------
oPlayer
create
カメラフォロー
view_camera[0] = camera_create_view(x-500,y-200,1000,400,0,oPlayer,-1,-1,100,100);
step(scrProcessPlayer)
足元のタイルを3点調べる。tileのtCollision
c1 = tilemap_get_at_pixel(oGame.map,x-(sprite_get_width(sprite_index)/2),y); 
c2 = tilemap_get_at_pixel(oGame.map,x+(sprite_get_width(sprite_index)/2),y); 
c3 = tilemap_get_at_pixel(oGame.map,x,y); 

y = real(y&$ffffffc0);タイルの上に移動?8進数
if( y&$3f>0 )?
----------------------------------
oGhostを参考にテストをしてみたい。

stepーscript

var xx,yy,c1,c2; // temp var only for use in this script

hspd = dir * spd; // find out how far the object has moved
x+=hspd; // apply the distance to the object

if(dir == -1){ // if moving left
image_index = 1; // set the sprite to point the correct way
c1 = -1; // reset the collision tile checkers
c2 = -1;
c1 = tilemap_get_at_pixel(oGame.map, x, y); // check the left edge of the sprite
c2 = tilemap_get_at_pixel(oGame.map,x,y+sprite_height); // check below the left edge of the sprite, since ghosts dont like heights
if*1{ // if there is something blocking the left or if there would be a fall to the left
x = (x&$ffffffc0)+sprite_width; // move the object to the edge of the tile
dir *= -1; // change the direction
}
}else if(dir == 1) // if moving right
{ // Otherwise, check collision to the right
image_index = 0; // set the sprite to point the correct way
c1 = -1 // reset the collision tile checkers
c2 = -1;
c1 = tilemap_get_at_pixel(oGame.map,x+sprite_width,y); // check the right edge of the sprite
c2 = tilemap_get_at_pixel(oGame.map,x+sprite_width,y+sprite_height); // check below the right edge of the sprite, since ghosts dont like heights
if*2{ // if there is something blocking the right or if there would be a fall to the right
x = (x&$ffffffc0); // move the object to the edge of the tile || $ffffffc0 rounds the position to the nearest 64
dir *= -1; // change the direction
}
}

 -------------------------------------

 daruinode text script

///(x,y,text,hspeed,vspeed,color,destroytime)

var textobject = instance_create_layer(argument0,argument1,"Text_Layer",obj_Text);
textobject.text = argument2;
textobject.hspeed = argument3;
textobject.vspeed = argument4;
textobject.textcolor = argument5;
textobject.alarm[0] = room_speed*argument6;

 

*1:c1 >= 1) || (c2 <= 0

*2:c1 >= 1) || (c2 <= 0

Arbor:   自分用メモ

Arbor2のメモ。

AssetStoreアフィリエイト開始記念キャンペーン – ケットシーウェア

 Arbor2はunityでステートマシンを使うことができるアセットです。



 ステートマシンはunityのMechanimにもついている。下記参照。

docs.unity3d.com

<使い分け>
アニメ素材で遷移を管理したい=>Mechanim
コード+ステートマシンで管理したい。=>Arbor

使うと便利な事。
・ステート毎に分けてコードを書けるのでシンプルでわかりやすいし、バグも見つけやすい。monodevelopを継承しているのですぐ使える。


ステートの小さな歯車をクリックしてスクリプト編集を使うと、コードが見れるので参考になる。


f:id:gamemaker98:20161113223045j:plain

開始ステートから接続されたステートに移る。
常駐ステートはいつでも条件が満たされたら実行する。
ーーーーーーーーーーーーー
挙動
 ステートの遷移はTransitionに用意されている。
f:id:gamemaker98:20161114123245j:plain
 時間や距離などで遷移する事ができる。
 即遷移はgotoTransition

-----------------------------------

実行順序

http://arbor.caitsithware.com/tutorial/coding/

Awake <=  これが最初
OnStateAwake
OnStateBegin
Start <= 順番注意:
Update

-----------------


statebehavior のコードを書くには

Project =>Create => Arbor =>StateBehavior =>C#を選択しファイルを作る。
作ったスクリプトはArborEditorで挙動追加=>scriptの中に入っている。

StateBehaviourのカスタマイズ – Arbor

スクリプトでArborを使うにはusing Arbor;を宣言する。

------------------------------------------------


変数
プロパティで設定するならseriarizeかpublicしたものを使う。

f:id:gamemaker98:20161114122421j:plain
他のステートでも同じ変数を使いたい場合はParameterContainerを使う。

f:id:gamemaker98:20161114122247j:plain
シーンを遷移する場合も同じ変数を使いたいならglobalParameterContainer。

http://caitsithware.com/assets/arbor/scriptreference/ja/class_arbor_1_1_parameter_container_internal.html

外部から利用例:基本の変数コマンドは用意されている。
--- set

gameObject.GetComponent<ParameterContainer>().SetFloat("damagex",9f);

---- get
int seeRange;

gameObject.GetComponent<ParameterContainer>().GetFloat("seeRange",out seeRange);


------------------------------------

ステートの移動はTransition 。stateLinkに接続先を指定。
public StateLink NextState;で指定したステートをエディタで繋ぐ。
Transition(NextState);

-------------------------------

イベントにメッセージを送るにはsendTrigger系。
受けるにはTriggerTransitionを常駐させる。

 

f:id:gamemaker98:20161114091241j:plain

 

外部からステートを遷移させたいとき
gameObject.GetComponent<ArborFSM>().SendTrigger("ChangeState");

----------------------------------------

一定時間ごとに条件判定させて遷移する方法は、coroutine等があるようだ。

coroutineの参考にしたサイト:

dnasoftwares.hatenablog.com

public override void OnStateBegin() {
StartCoroutine(Loop(interval));
}
private IEnumerator Loop(float interval){
while(true){
yield return new WaitForSeconds(interval);
// if (-----)  Transition(NextState);
}
public override void OnStateEnd() {
StopAllCoroutines();// ("Loop")
}

-----------------------------------------
statebehaviourから現在のステート名を見るにはstate.name;

外部から現在のステートは何か取得する場合
gameObject.GetComponent<ArborFSMInternal>().currentState.name

注意:
上記をmonoのStartから実行するとエラーが出る。
monobehaviourのStartとarborFSMのステートの実行順を理解する必要がある。

 

--------------------------------------------

 参考ツイート

 


参考にしたサイト

フォーラム:掲示板

Arbor: State Diagram Editor - Index page

-------------------------------------------------------

 

tsubakit1.hateblo.jp 

tsubakit1.hateblo.jp

 

Linq 自分メモ

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;//これが必要

public class createItemObect_Manager : MonoBehaviour {

public ItemDatabase itemdb;
public GameObject originalItemObject;
private List<Item> AllItemList = new List<Item>();
// Use this for initialization
void Start () {

foreach (Item i in itemdb.itemDB){//
AllItemList.Add(i);
//GameObject copyObj = Instantiate(originalItemObject) as GameObject;
//copyObj.GetComponent<ItemObject>().item = i;
}

var itemList = AllItemList.Where(n => n.itemType ==Item.ItemType.Potion).ToList();

var weaponlist = AllItemList.Where(n => n.itemType ==Item.ItemType.Weapon).Select(n => n.itemAttack*2).ToList();

foreach(var n in weaponlist){
Debug.Log("attack:"+n);
}


}
}