ラベル サンプルコード の投稿を表示しています。 すべての投稿を表示
ラベル サンプルコード の投稿を表示しています。 すべての投稿を表示

2023年10月19日木曜日

Unityで一文字つづ表示する一番シンプルな方法C#

 UnityのレガシーTextでも使える一文字つづ表示する一番シンプルな方法です。

ソース

private void SkipMode()

    {

StartCoroutine(Mojiokuri());

}

private string mess = "こんにちは、今日もよろしく";

private string[] words;

//コルーチン

IEnumerator Mojiokuri()

{

words = mess.Select(x => x.ToString()).ToArray();

foreach (string word in words)

{

//0.1秒ごとに1文字表示する

od.uimesse.text = od.uimesse.text + word;

yield return new WaitForSeconds(0.1f);

}

}

所感

テキストメッシュプロを使わないシンプルな方法です。

デフォで付けてほしい。

2016年8月4日木曜日

AudioSourceをスクリプトからインスタンスにする。New AudioSource

AudioSourceはNew AudioSourceで実体化できません。
gameObject.AddComponent<AudioSource>()で実体化できます。
以下サンプル
using UnityEngine;
using System.Collections;
//
Resources/Oto/filename.mp3
public class SousaOto {
    //Oto
    public AudioClip bgm,jump,koin,hou,goal,sasaru;

    public AudioSource asj,asb,ask;

    private MonoBehaviour mb;

    public SousaOto(MonoBehaviour inmb){
        mb = inmb;
        asj = inmb.gameObject.AddComponent<AudioSource>();//new AudioSource ();
        asb = inmb.gameObject.AddComponent<AudioSource>();
        ask = inmb.gameObject.AddComponent<AudioSource>();
        jump = readMp3 ("Oto/jump");
        sasaru = readMp3 ("Oto/sasatu");
        koin = readMp3 ("Oto/coin05");
        hou = readMp3 ("Oto/taihou");
        goal = readMp3 ("Oto/kuria");
    }


    public AudioClip readMp3(string fileName){
        AudioClip ac = (AudioClip)Resources.Load (fileName);
        return ac;

    }
}

音を鳴らすクラスのサンプルです。

unity バイト配列の連結と変換サンプル

unityでバイト配列操作のメモ。
//バイト配列から値型へ変換
public static float GetMyNo(this byte[] ba)
{
float x;
x = BitConverter.ToSingle (ba, 2);
return x;
}
//バイトデータの比較
switch (test[0]) {
case (byte)'P':
Debug.Log ("P");
test = BitConverter.GetBytes ('N');
break;
case (byte)'I':
Debug.Log ("I");
test = BitConverter.GetBytes ('S');
break;
case (byte)'T':
Debug.Log ("T");
test = BitConverter.GetBytes ('P');
break;
case (byte)'S':
Debug.Log ("S");
test = BitConverter.GetBytes ('T');
break;
case (byte)'N'://ニックネーム
Debug.Log ("N");
test = BitConverter.GetBytes ('I');
break;
//各種値を一つのバイト配列へ変換
public static byte[] GetJikiByte(this Transform tr,int myNo, int jyo,bool muki)
{
byte[] ba;
ba = RenkatuByte (
BitConverter.GetBytes ('P'),
BitConverter.GetBytes (myNo),
BitConverter.GetBytes (tr.position.x),
BitConverter.GetBytes (tr.position.y),
BitConverter.GetBytes (jyo),
BitConverter.GetBytes (muki)
);
return ba;

}

//複数のバイト配列を一つのバイト配列へ連結
public static byte[] RenkatuByte(byte[] iti, byte[] nii, byte[] sann,byte[] yon,byte[] gou)
{
byte[] ret = new byte[iti.Length + nii.Length + sann.Length+yon.Length+gou.Length];
Buffer.BlockCopy(iti, 0, ret, 0, iti.Length);
Buffer.BlockCopy(nii, 0, ret, iti.Length, nii.Length);
Buffer.BlockCopy(sann, 0, ret, iti.Length + nii.Length,sann.Length);
Buffer.BlockCopy(yon, 0, ret, iti.Length + nii.Length+sann.Length,yon.Length);
Buffer.BlockCopy(gou, 0, ret, iti.Length + nii.Length+sann.Length+yon.Length,gou.Length);
return ret;
}
//6つの場合
public static byte[] RenkatuByte(byte[] iti, byte[] nii, byte[] sann,byte[] yon,byte[] gou,byte[] roku)
{
byte[] ret = new byte[iti.Length + nii.Length + sann.Length+yon.Length+gou.Length+roku.Length];
Buffer.BlockCopy(iti, 0, ret, 0, iti.Length);
Buffer.BlockCopy(nii, 0, ret, iti.Length, nii.Length);
Buffer.BlockCopy(sann, 0, ret, iti.Length + nii.Length,sann.Length);
Buffer.BlockCopy(yon, 0, ret, iti.Length + nii.Length+sann.Length,yon.Length);
Buffer.BlockCopy(gou, 0, ret, iti.Length + nii.Length+sann.Length+yon.Length,gou.Length);
Buffer.BlockCopy(roku, 0, ret, iti.Length + nii.Length+sann.Length+yon.Length+gou.Length,roku.Length);
return ret;
}

2015年10月23日金曜日

Unity C# String二次配列からデータを検索するサンプル

unity用のルックアップ関数のサンプルソースです。
CSVを読み込んでString2次配列に入れるサンプルはこちら
unityでCSVを読み取るサンプル

    //探す文字、CSVデータ、探す列、返す列
    public string lookup(string name,string[,] str,int sagasu,int kaesu){
        string tmp = "";

        for (int i=0i<str.GetLength(0); i++) {
                        if (name.Equals(str[isagasu])) {
                                tmp = str [ikaesu];
                                i = str.Length;
                        }
                }

        return tmp;
        }


エクセルのルックアップ関数ってこんな感じでしたっけ?
GetLengthとlengthを間違えることがあるので覚書。
lengthは2次配列全ての要素数。GetLength(0)は[x、y]のyを省いた要素数。次元を一つ減らして数えるイメージです。

2015年9月13日日曜日

unity PCのローカルへファイルを保存するサンプル

pcのローカルへファイルを保存するサンプルです。
assetsフォルダと同じディレクトリにassets2フォルダをあらかじめ用意ししてください。

以下使用例

            FileSaveText ("/../assets2/pass.csv",datas);
            EditorUtility.DisplayDialog("Information""SYUURYOU !!! TEXT""OK");


//テキストデータの保存
    public void FileSaveText(string fileName,String fileData){
        StreamWriter sw;
        FileInfo fi;
        fi = new FileInfo(Application.dataPath + fileName);
        sw = fi.AppendText();
        sw.WriteLine(fileData);
        sw.Flush();
        sw.Close();
    }

//バイトデータの保存    public void FileSaveGazo(string fileName,Byte[] fileData){

        string path = string.Format("{0}/{1}"Application.dataPath , fileName);
        File.WriteAllBytes(pathfileData);

    }

2015年9月9日水曜日

unity2d:キャラクターを瞬きさせるサンプル

2dキャラクターの瞬きを実装するには、一定秒数間隔で動作するコルーチンを使用します。
以下の方法を使えば一定時間置きに動作させられます。

    void 瞬き開始() {
        //ループコルーチン
        StartCoroutine(loop());
    }
    private bool FLML=true;//終了フラグ
    private float fme=5f,MABATAKI=10f;//10秒間隔で瞬き
    private IEnumerator loop() {
        // ループ n秒間隔

        FLML = true;
        while (FLML) {
            yield return new WaitForSeconds(fme);
            onTimer();
        }
    }
    private bool FLM=true;
    private void onTimer() {
        if (FLM) {
            目を閉じる
            FLM =false;
            fme=0.2f;//閉じている時間は短く
        } else {
            目を開ける
            FLM =true;
            fme=MABATAKI;
        }
    }


キーワード。コルーチン、タイマー

private bool FLM=true;が抜けていたので修正しました。

2015年8月1日土曜日

unity推奨されるデータの保存サンプル

iOSとAndroidでも使用できるunityのデータ保存のサンプルソースです。
保存データ用のクラスをシリアライズして保存しています。
確かunityの推奨している保存方法の一つだったと思います。
iOSnoバージョンが古いとエラーが発生するので旧式の端末ではテストできないかも?

//使用例
    private SaveDatas sd ;
    private string SAVE ="key文字列";
    private void DataSave2(){
        SaveKanri.Save(SAVEsd);
        PlayerPrefs.Save();

    }
    private SaveDatas DataLoad2(){
        SaveDatas data_str = SaveKanri.Load<SaveDatas>(SAVE);
        ifdata_str != null){
            return data_str;
        }else{
            return new SaveDatas();
        }


//管理クラス
using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class SaveKanri : MonoBehaviour{
    
    public SaveKanri(){
    }
    
    public static bool Save<T>(string prefKey,T obj){
        MemoryStream memoryStream = new MemoryStream();
        #if UNITY_IPHONE || UNITY_IOS
        System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER""yes");
        #endif
        BinaryFormatter bf = new BinaryFormatter();
        bf.SerializememoryStreamobj );
        
        string str = System.Convert.ToBase64StringmemoryStream.ToArray() );
        try {
            PlayerPrefs.SetString ( prefKeystr );
        } catchPlayerPrefsException ) {
            return false;
        }
        return true;
    }
    
    public static T Load<T>( string prefKey ){
        if (!PlayerPrefs.HasKey(prefKey)) return default(T);
        #if UNITY_IPHONE || UNITY_IOS
        System.Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER""yes");
        #endif
        BinaryFormatter bf = new BinaryFormatter();
        string serializedData = PlayerPrefs.GetStringprefKey );
        
        MemoryStream dataStream = new MemoryStreamSystem.Convert.FromBase64String(serializedData) );
        T deserializedObject = (T)bf.DeserializedataStream );
        
        return deserializedObject;
    }

}

//保存するデータクラス
using System.Collections;
[System.Serializable()]
public class SaveDatas{
    [System.Serializable()]
    public class InnerClass{
        public string instr1;
        public int inint;
    }

    public string str1;
    public int[] int10;
    public InnerClass inClass;
    
}


以前までusing PlayerPrefs = PreviewLabs.PlayerPrefs;を使用して保存していました。最近どうもPreviewLabs.PlayerPrefsで以下のエラーが発生して他の保存方法に切り替えました。
以下がエラーログ
PlayerPrefs.Flush NullReferenceException Object reference not set to an instance of an object

2015年7月21日火曜日

Unity uGUI Image画像を動的に変更する

インスペクタから画像を設定して、適当なボタンに画像変更()を割り当てます。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class スクリプト
 : MonoBehaviour {

    public Sprite 画像1;
    public Sprite 画像2;


    private GameObject obj;
    private Image image;

    void Start () {
        obj = GameObject.Find("image(imageオブジェクトの名前)").gameObject as GameObject;
        image = obj.GetComponent<Image> ();
    }

    public void 画像変更(){
        image.sprite = 画像2;
    }

}

2015年5月7日木曜日

UNITYでネットワーク上のファイルを取得して保存するサンプル

wwwクラスを使用して、インターネット経由で取得したデータをassetに保存します。
保存先はプロジェクト名/assetになります。
2パターンのソースがありますがバイト処理だけでも良いかも。
using System.IO;
using System;

・・     void Start () {
//htmlの取得と保存        
StartCoroutine ("WWWText");
//画像ファイルの保存        
StartCoroutine ("WWWGazo");
    }
    
    
    IEnumerator WWWText () {
        WWWForm form = new WWWForm ();
        WWW www = new WWW ("http://XXX.html");
        yield return www;
        FileSaveText ("/test02.text",www.text);
    }
    
    
    [SerializeField]
    protected Material material;
    
    // GAZO HTTP
    IEnumerator WWWGazo () {
        WWW www = new WWW("http://XXX.jpg");
        yield return www;
        material.mainTexture = www.texture;
        FileSaveGazo ("test.jpg",www.bytes);
    }
    
    
    public void FileSaveText(string fileName,String fileData){
        StreamWriter sw;
        FileInfo fi;
        fi = new FileInfo(Application.dataPath + fileName);
        sw = fi.AppendText();
        sw.WriteLine(fileData);
        sw.Flush();
        sw.Close();
    }
    public void FileSaveGazo(string fileName,Byte[] fileData){
//以下の方法でパスをくぎれる
        string path = string.Format("{0}/{1}"Application.dataPath , fileName);

// 画像ファイル保存.
        File.WriteAllBytes(pathfileData);

    }

2015年1月13日火曜日

C#で型を引数として渡すサンプル

C#で型引数を使用した配列インスタンス作成サンプルです。
    private T[] SyokikaKurassu<T>(int kazuwhere T : new(){
        T[] tmp = new T[kazu];
        for (int i=0i<kazui++) {
            tmp[i]=new T();
        }
        return tmp;
    }

使い方は

クラス = SyokikaKurassu<クラス> (配列の数);
型引数は言語とそのバージョンによって使い方が変わってくることがあります。
便利なので忘れないようにメモ。。

2014年11月5日水曜日

Unity CSVファイルの読み取り

UnityのC#スクリプトでCSVファイルを読み取るサンプルソースです。
Resources.LoadはAsett/Resourcesフォルダのファイルを読み込みます。
Resourcesフォルダを作成し、そこにファイルを配置してください。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
//適当なゲームオブジェクトに貼りつけてください
public class FileSousa  : MonoBehaviour{
private string[,] CsvDate1;

void Start () {
CsvDate1= readCsv ("Namelist");
Debug.Log (CsvDate1 [2, 0]);//三行目の一列目を表示例
}

private string[,] readCsv(string fileName){

TextAsset ta = Resources.Load(fileName, typeof(TextAsset)) as TextAsset;
//改行コードで一次配列に
string[] lineArray = ta.text.Replace("\r\n", "\n").Split('\n');   
ArrayList dataList = new ArrayList (lineArray);

//行数と列数を
int lineCount =  dataList.Count;
string tmp =  dataList [0].ToString();
string[] tmp2 = tmp.Split(","[0]);
int colCount = tmp2.Length;
string[,] tmpCsvData = new string[lineCount, colCount];
int i = 0;


foreach (string str1 in  dataList) {
int j = 0;
string[] tempLine = str1.Split(',');
foreach(string str2 in tempLine){
//二次配列を作成
tmpCsvData[i, j] = str2;
j++;
}
i++;
}
return tmpCsvData;
}
}

MonoBehaviourを削除して普通のクラスにしてもOKです。
ゲームデータをCSVで管理できます。

2014年10月23日木曜日

Unityボタンでのジャンプ力の調整と空中での移動

アクションゲーム用のジャンプ制御を改良してみました。

  • ジャンプボタンを押しっぱなしでジャンプ力が増します。
  • 空中で左右へ移動できます
  • 二段ジャンプはできません。
  • 横移動して落下中もジャンプはできません。

接地判定は以下の記事を参考にしてください。
キャラクターコントロールクラスと地面判定の記事はこちら

以下がサンプルソースです。
public float speed =   9.0f;
public float jumpspeed = 5.0f;
private float JAMP_SPEED = 6.5f;
public float gravity = 9.0f;
private Vector3 idou =  new Vector3();
public void Start()
{
//kyo.jimen = false;//地面判定は自作しないと
}
public void Update()
{
//地面判定
if (kyo.jimen) { idou = new Vector3 (Input.GetAxis ("Horizontal"), 0, Input.GetAxisRaw ("Vertical"));
idou = transform.TransformDirection (idou);
idou *= speed;
if (Input.GetButton ("Jump")) {
idou.y = jumpspeed;
}

} else {//空中でも移動
idou.x = Input.GetAxis ("Horizontal") * speed;
if (Input.GetButton ("Jump")) {
jumpspeed= jumpspeed/2;
idou.y += jumpspeed;
}
}
idou.y -= gravity * Time.deltaTime;

rigidbody.velocity = idou;//直接加速度を設定すつ
}
//地面判定
void OnCollisionEnter(Collision collision)
{
kyo.jimen = true;
jumpspeed = JAMP_SPEED;

}
void OnCollisionExit(Collision collision)
{
kyo.jimen = false;
}

やっつけ仕事ですみません。操作性はゲームの要なので、まだまだ改良していく予定です。
シフトや論理演算を使うなど処理速度を改善できればと思います。

2014年10月16日木曜日

Unity キャラクターの移動とジャンプ

スペースキーでジャンプ。矢印キーで移動します。
CharacterControllerクラスを使用したアクションゲームのサンプルソース。
動かしたいオブジェクトにRegitBodyとCharacterControllerと以下のスクリプトクラスを追加して使用してください。

基本オブジェクト以外を動かす場合はCharacterControllerの辺り判定を調整してください。

using UnityEngine;
using System.Collections;

public class ChareIdou : MonoBehaviour {

public float speed =   9.0f;
public float jumpspeed = 9.0f;
public float gravity = 20.0f;


private Vector3 moveDirection =  new Vector3();
private CharacterController controller;

public void Start()
{
controller =GetComponent("CharacterController")as CharacterController;
}

public void Update()
{
//CharacterController.isGroundedキャラクターが地面に接しているか?
if (controller.isGrounded)
{
moveDirection = new 
//TransformDirectionはローカルのTransform情報をワールド座標系に変換します
Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxisRaw("Vertical"));
moveDirection = transform.TransformDirection (moveDirection);
moveDirection *= speed;

if(Input.GetButton ( "Jump"))
{
moveDirection.y = jumpspeed;
}
}
//Time.deltaTimeは前フレームが呼び出されたときからの経過時間を取得出来ます
moveDirection.y -= gravity * Time.deltaTime;

controller.Move (moveDirection * Time.deltaTime);
}
}

2014年10月1日水曜日

Unityシングルトン。スクリプトやシーン間でのデータ共有

シングルトンで必要な機能。
一つの実体でいつでもどこからでもデータを保持受け渡しできること。
Unityのシングルトンにはいろいろと制約があるのでC#はJAVAに慣れている人でもリファレンスを見る必要があるかも。

以下のC#スクリプトを作成する。
Tukau1 シングルトンデータを使うクラス。どこに実装してもいい。
DataKanri 空のゲームオブジェクトに実装する。(ドラッグドロップ)
Kyouyuu 共有データ置き場。とりあえず変数mojiを共有。


データを実際に使用する場合
using UnityEngine;
using System.Collections;

public class Tukau1: MonoBehaviour {

void Start () {
DataKanri dk = DataKanri.Instance;
Debug.LogWarning (dk.moji");
                dk.moji="Tukau1"; 
       Debug.LogWarning (dk.moji");
}
}

データをゲームオブジェクトに関連付けて保持する
using UnityEngine;
using System.Collections;

public class DataKanri: Kyouyuu<DataKanri> {

void Awake(){
DontDestroyOnLoad (this);//シーン移動でゲームオブジェクトを破棄しない
}

// Use this for initialization

void Start () {

}

// Update is called once per frame
void Update () {

}

}

実際にデータを置く場所。
using UnityEngine;
using System.Collections;

public class Kyouyuu<T> : MonoBehaviour where T : Kyouyuu<T>
{
public string moji ="Kyouyuu";//必要なだけ変数を作ってOK。内部クラスを作っても良い

protected static T instance;
public static T Instance {
get {
if (instance == null) {
instance = (T)FindObjectOfType (typeof(T));

if (instance == null) {
Debug.LogWarning (typeof(T) + "インスタンス無いよ");
}
}

return instance;
}
}

protected bool CheckInstance()
{
if( instance == null)
{
instance = (T)this;
return true;
}else if( Instance == this )
{
return true;
}

Destroy(this);
return false;
}

protected void Awake()
{
CheckInstance();
}

}


適当なソースから使いやすそうなものをチョイスしました。
他にもシングルトンの書き方があるそうです。