k01ken’s b10g

He110 W0r1d!

Unity(3D/C#編)で詰まったところ

開発環境は、Windows 7 Professional(32bit) + Unity 5.6.3f1 Personal。

■特定の要素を消したい
要素を消したければ、Hierarchyタブから消したい要素を選択し、右クリックして、Deleteを選択する。


■エディタを変更する
自分の場合は、デフォルトでは、Visual Studio 2017(Community)が使われているんですが、起動すると自分の貧弱な処理能力のパソコンで動作が重くてエディタを切り替えることにしました。
1.Unity上部のEditボタンをクリックし、Preferences...をクリックします。
2.External Toolsを選択し、External Script Editorのプルダウンメニューから、Browse...を選択すると、パソコン内のエディタが選択できるので自分の場合は、TeraPadを選択しました。(C:\Program Files\TeraPad\TeraPad.exe)
3.スクリプトInspectorタブでOpen...ボタンをクリックすると、TeraPadが起動するようになります。後は、TeraPadで書いて、保存すると、自動的に、Unity側の内容も更新されるようになります。


■GameObjectの色を変える
1.ProjectタブのCreateをクリックして、Materialをクリックする。
2.ProjectタブのAssets内の作ったMaterialをクリックし、InspectorタブのAlbedoと書かれた欄の
3.白色の四角をクリックするとColorウィンドウという色の一覧表が出るので好きな色にする。
色を選択したら、Colorウィンドウの×ボタンで閉じる。New Materialタブで色が変更されたと思います。
4.ProjectタブのAssetsのマテリアルをドラッグ&ドロップでHierarchyタブの色を変更したい
GameObjectに持っていくことで、Sceneタブの特定のGameObjectの色が変更されたと思います。


■シーンを変える
1.複数シーンを作っておく
2.Unity上部のFile - Build Settingをクリック
3.Assetタブにある読み込みたいシーンすべてをウィンドウ内にドラッグ&ドロップして、そのBuild Settingウィンドウを×ボタンで消しておく。
4.後はC#スクリプト内に以下のコードを追加する。

// コード上部に
using UnityEngine.SceneManagement;

// メソッド内に入れる
SceneManager.LoadScene("読み込みたいシーン名");

5.そのスクリプトを自分が望むもの(例えば、ボタンなど)に適用させる。


■ボタンを表示させる
1.HierarchyタブのCreateボタンをクリックし、UI - Buttonをクリックする。そうすると、Hierarchyタブに、Canvas - Buttonが追加される。
2.Hierarchyタブ内の今作ったButtonの左側にある右向きの矢印をクリックし、Textを表示し、Textをクリックする。そうすると、TextのInspectorタブが表示されるので、InspectorタブのText(Script)にSTARTと入力し、Unityを実行すると、以下のように表示される。何度押しても、何も実行されない。
f:id:k01ken:20180603183041p:plain
・ボタンの位置は、Buttonをダブルクリックして、カメラをButton基準にしてからだと、動かしやすい。


■ボタンの作成+クリックイベントの追加
1.ボタンを作る - 上記に書いている。
2.ProjectタブのCreateボタンをクリックし、C# Scriptをクリックする。
3.作ったC#スクリプトをダブルクリックし、表示させ、以下のコードを入力する。

// 以下のメソッドを追加する
	public void OnClick(){
		Debug.Log("clicked");
	}

4.ProjectタブのAssets内にある先ほど作ったC#スクリプトを、HierarchyタブのButtonにドラッグ&ドロップする。
5.HierarchyタブのButtonをクリックし、ButtonInspectorタブを表示し、On Click()の欄の+ボタンをクリックする。
6.None (Oとなっている左下のところに、InspectorタブのButtonをドラッグ&ドロップする。
7.InspectorタブのNo Functionの部分をクリックし、作成したC#スクリプト名 - OnClick()を選択する。
8.実行して、成功しているならば、STARTボタンをクリックすると、Consoleタブにclickedという文字が表示されているはず。


■GameObjectを削除する
・GameObjectを削除するには、Destroyメソッドを用います。
・今回は、CubeとButtonを作って、Buttonをクリックしたら、表示されているCubeを削除するようなプログラムを作ります。■ボタンの作成+クリックイベントの追加を参考にして、作ってみてください。

	public GameObject Cube;
	void Start () {
		Cube = GameObject.Find("Cube");
	}
	
	public void OnClick(){
		Destroy(Cube);
	}

参考リンク
Destroy - Unity



■要素を動かす(自動)
1.Unity上部のAssetsボタンをクリックし、Create - C# Scriptをクリックする。
2.Assetsタブに、スクリプトが作成されているので、それをクリックし、Inspectorタブを見て、Open...ボタンをクリックする。
3.以下のコードを追加して、保存する。

private Vector3 m_pos;
void Start(){
m_pos  = transform.localPosition;
}

void Update(){
transform.localPosition = m_pos;
m_pos.y += 0.05f;
}

4.そのC#スクリプトスクリプトを適用させたいHierarchyタブの要素にドラッグ&ドロップして、後は、Unityを実行すると、その要素は、1フレームごとに上昇していく。

参考リンク
unity_move_gameobject - FreeStyleWiki
【Unity】C#でtransform.positionの値を変更する


■操作したいGameObjectを指定するにはどうすればいいか?

	GameObject obj;
	void Start(){
		obj = GameObject.Find("GameObject名");
	}

という風に取得する。なければ、nullが入るので、受け取る変数は、初期化していないとエラーになる。

参考リンク
GameObject.Find - Unity スクリプトリファレンス


GameObjectに手持ちの画像を貼りつける
1.事前にCubeとMaterialを作成しておく。
2.作ったMaterialを右クリックして、Import New Asset...をクリックし、任意の画像を選択するとAssetsに追加される。
3.Materialをクリックして、InspectorタブのShaderをStandardからLegacy Shaders - Diffuseをクリックする。
4.Selectと書かれた四角の部分にAssetsにある画像をドラッグ&ドロップする。
5.AssetsにあるMaterialをCubeにドラッグ&ドロップすると、Cubeの各面に画像が貼り付けられている。
f:id:k01ken:20180606193740p:plain
参考リンク
第4回目:オブジェクトにマテリアルやテキスチャを適用する(後編)|Tech Book Zone Manatee


■キー入力を受け取る
・Input.GetKeyだと押しっぱなしでも毎回機能する。押している状態で発生。
・Input.KeyDown - 押していない状態から押すと発生。
・Input.KeyUp - 押している状態から離すと発生。
参考リンク
UnityのInputで入力を扱う
【Unity】2D用の、キーボードで上下左右動かせるスクリプト · GitHub

Unityを使う

開発環境は、Windows 7 Professional(32bit) + Unity 5.6.3f1 Personal。

YouTubeの動画を見て、自分も作ってみたくなって作ることにした。

unity 入門


1.Unityを起動する
2.EmailPasswordを入力してSign inボタンを入力する
f:id:k01ken:20180603163617p:plain
3.右上のNEWを入力する
f:id:k01ken:20180603163629p:plain
4.Project nameLocationOrganizationを選択し、Create Projectボタンをクリック
f:id:k01ken:20180603163635p:plain
5.Unityが再起動する
6.Unity上部のGameObjectをクリックし、3D Object - Cubeを選択する
7.InspectorタブのScale部分でXを5、Yを0.1、Zを5にする。平たい天下一武道会のリングみたいになる。
f:id:k01ken:20180603164501p:plain
8.Unity上部のGameObjectボタンをクリックする。3D Object - Sphereをクリックする。
9.InspectorタブのPosition部分のYを3、Scale部分でXを1、Yを1、Zを1にする。空中に球体が浮かんだような状態になる。
f:id:k01ken:20180603165246p:plain
10.球体を選択してから、Unity上部のComponentボタンをクリックし、Physics - Rigidbodyをクリックする。
もしくは、球体の要素を選択して、InspectorタブのAdd Componentボタンをクリックし、Physics - Rigidbodyをクリックしても同じことができる。
11.Unity上部の再生ボタン(一番左側)をクリックすると、球体が板まで落下する。(Ctrlを押しながら、Pを押すと、実行され、もう一度、Ctrlを押しながら、P押すと停止します。)
f:id:k01ken:20180603165859p:plain
12.球体はただ落下するだけで、反発しないので反発するようにする。
Unity上部のAssetsボタンをクリックし、Create - Physic Materialを選択する。
13.AssetsタブのNew Physic...を選択し、InspectorタブのBouncinessを0.99に変更する。
f:id:k01ken:20180603173316p:plain
14.AssetsタブのNew Physic...をドラッグして、Hierarchyタブの反発を適用させたい要素にドロップする。

参考リンク
Unity5でボールの跳ね返り! - Collonville’s blog

Herokuを使う

1.サイトへアクセスする。
クラウド・アプリケーション・プラットフォーム | Heroku

2.右上の三本線をクリックし、新規登録をクリックする

3.苗字、名前、メールアドレス、役職(趣味なら、趣味での開発を選ぶ)、国、主な開発言語を入力して、reCAPCHAを
入力して、無料アカウントを作成ボタンをクリックする

4.登録したメールアドレスへアクセスし、メール内のリンクをクリックする。

5.パスワードを入力して、パスワードを設定しログインするボタンをクリックする。

6.ここをクリックして次に進んでくださいボタンをクリックする。

Railsで詰まったところ

開発環境は、Windows 7 Professional(32bit) + ruby 2.3.3p222 + Rails 4.2.1。


コマンドプロンプト(Railsのコンソール)からテーブルの現在のカラムを調べる
・今回はusersテーブルの中身を調べる

まず、コンソールを起動します。

rails c
User.columns

f:id:k01ken:20180609133628p:plain
このままでは色んな情報が出るので、見やすくするために、以下のようにする。

User.columns.map(&:name)

f:id:k01ken:20180609133641p:plain
他にも、よく使うコマンドとして、

User.count # usersテーブルの行数を取得します

f:id:k01ken:20180609182624p:plain

User.find(1) # usersテーブルでidカラムが1のデータを取得します

f:id:k01ken:20180609182636p:plain

Rails.env # 現在の環境がdevelopment,test,productionのいずれなのかを知る

f:id:k01ken:20180609184245p:plain
などがあります。


参考リンク
rails c でカラムの確認


■whereメソッドで検索して特定のカラムだけ取得したい場合
itemsテーブルからwhereメソッドでurlカラムにhrnabi.com/が含まれているレコードを抽出して、そのカラムのidだけを一覧として表示したい場合、以下のようにします。

Item.where("url LIKE '%hrnabi.com/%'").map(&:id)

f:id:k01ken:20180915115004p:plain


マイグレーションスクリプトからテーブルにカラムを追加する
・例えば、usersテーブルにpassword_digestという文字列型のカラムを追加する場合、以下のコマンドを入力する。

rails g migration AddColumnToUsers

db/migrateディレクトリ内に日付_add_column_to_users.rbというファイルが生成されているので、その中のchangeメソッド内に以下のコードを入れる。

	add_column :users, :password_digest, :string

そして、マイグレーションする。

rake db:migrate

参考リンク
Ruby on Rails カラムの追加と削除
rails generate migrationコマンドまとめ
Boolean型のカラムを追加するときは必ずデフォルト値を設定しよう


■コントローラ側でフォームからの値を受け取る方法

# name属性がqの値を受け取ります
keyword = params[:q]


■ビューにてフォームを作る
簡単なテキストボックスと送信ボタンのフォームを作ります。
ソースを見てみると、UTF-8エンコーディングされる隠しinputタグとCSRF対策のトークンの各誌inputタグが自動的に作成されます。これがないと、送信が成功しないようです。

<%= form_tag("/post", method: "post") do %>
<%= text_field_tag(:q) %>
<%= submit_tag("送信") %>
<% end %>

実行結果
f:id:k01ken:20180603021028p:plain

参考リンク
Railsのフォーム基本的な作成方法まとめ(form_forとかform_tag)
Action View フォームヘルパー | Rails ガイド
フォーム(form) - - Railsドキュメント


■ビューで画像を表示させる
基本的に、app/assets/imagesディレクトリ内に画像を入れた場合と、publicディレクトリ内に画像を入れた場合の2パターンがあるようだ。

# app/assets/imagesディレクトリに画像を入れた場合
<%= image_tag 'test.jpg' %>
# publicディレクトリに画像を入れた場合
<%= image_tag 'test.jpg' %>
# publicディレクトリ内にディレクトリを作成(今回はuploads)し、
# そこに画像を入れた場合
<%= image_tag '/uploads/test.jpg' %>

参考リンク
image_tagメソッドを使ったイメージタグの作成 - Ruby on Rails入門

CakePHP3でコンポーネントを作成する

開発環境は、Windows 7 Professional(32bit)+XAMPP v3.22+CakePHP 3.6.4。

複数のコントローラで使う共通処理をまとめたものをコンポーネントと言います。今回は、その作り方をメモしておきます。

1.カレントディレクトリをコンポーネントを作るディレクトリにして、

bin\cake bake component Common

と入力する。src/Controller/ComponentCommonComponent.phpが作成されている。
2.CommonComponent.phpを実行して、クラスの中に、以下の関数を作ってみる。

<?php
	public function add($number1, $number2){
		return $number1 + $number2;
	}
?>

3.使用するコントローラで、作ったコンポーネントを読み込む。試しに、SamplesController.phpにCommonコンポーネントを読み込む。

<?php
        /* initalize()メソッドを追加する */
	public function initialize(){
		parent::initialize();
		$this->loadComponent('Common');
	}

        /* indexアクションに追加する */
	public function index(){
		$result = $this->Common->add(10,20);
		$this->set("result",$result);
	}

?>

4.テンプレートをsrc/Template/Samples/index.ctpに作る。

<?= $result ?>

実行結果
f:id:k01ken:20180603011818p:plain


■現在読み込んでいるコントローラー名を取得する
1.上記のファイルを修正して作ってみることにします。CommonComponentに以下の関数を追加します。

<?php
	public function c_name(){
		return $this->_registry->getController()->name;
	}
?>

2.SamplesController.phpのindexアクションを書き換えます。

<?php
	public function index(){
		$result = $this->Common->c_name();
		$this->set("result",$result);
	}
?>

実行結果
f:id:k01ken:20180603013613p:plain

参考リンク
CakePHP3のコンポーネントとは?導入から共通処理をまとめる入門編
コンポーネント - 3.6

Rubyで詰まったところ

開発環境は、Windows 7 Professional(32bit) + ruby 2.3.3p222。


■既存のクラスに自作のメソッドを追加する

class String
	def StringSize
		return self.size
	end
end

puts "文字列です".StringSize # 5

参考サイト
Rubyアソシエーション: クラスの拡張
[Ruby]他のクラスを拡張するいろんな方法


■複数行のコメント
=begin~=endの中の行がコメント状態になります。

=begin
 puts "この間がコメント欄に"
=end

参考サイト
【Ruby】コメントの書き方


コマンドプロンプトからRubyスクリプトを書いて実行する
コマンドプロンプトにて、irbと入力する。
・終了するには、exitと入力する。


■二次元配列を作り方、読み込み方、書き換え方

arr = Array.new(5, Array.new(10, "."))

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

実行結果
f:id:k01ken:20180703160733p:plain

インデックスを指定して、要素を変えようとすると動作が、なぜか、おかしくなる。例えば、

arr = Array.new(5, Array.new(10, "."))

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

print "------\n"

arr[0][0] = "*"
arr[0][1] = "*"
arr[0][2] = "*"

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

実行結果
f:id:k01ken:20180703152512p:plain
このように、変更した要素以外にも、変更してしまっている。調べてみると、すべて同じ配列オブジェクトを参照していることが原因のようだ。object_idで調べるクセをつけておきたい。

以下のように書き換えてみる。

arr = Array.new(5){Array.new(10, ".")} # ここを書き換える

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

arr[0][0] = "*"
arr[0][1] = "*"
arr[0][2] = "*"

print "------\n"

for i in 0..arr.length - 1 do
  for j in 0..arr[i].length - 1 do
    print arr[i][j]
  end
    print "\n"
end

実行結果
f:id:k01ken:20180703160616p:plain
参考リンク
二次元配列の初期化をmapで [Ruby]


■そのオブジェクトが、どのクラスに属するのか調べる方法(型の判別にも使える)
.instance_ofメソッドを用いる場合。

if [].instance_of?(Array) # クォーテーションで囲わないので注意
	puts "Array"
else
	puts "Not Array"
end

.classメソッドを用いる場合。

p nil.class # NilClass
p true.class # TrueClass
p false.class # FalseClass
p 1.class # Fixnum
p "str".class # String
p [].class # Array

# 条件分岐に使う場合は、to_sメソッドを用いる
if [].class.to_s == "Array"
    puts "Array"
else
    puts "Not Array"
end

if "String".class.to_s == "String"
    puts "String"
else
    puts "Not String"
end

参考リンク
Ruby :: arrayかどうかチェックする [Tipsというかメモ]


■そのメソッドやプロパティが定義されているのかチェックする

class A
	attr_reader :name,:age
	def initialize(name)
		@name = name
	end

	def test
		puts "test"
	end
end

a = A.new("taro")

# 存在するtestを指定するとdefinedと表示される
if defined?(a.test) then
	puts "defined"
else
	puts "undefined"
end

# 存在しないhogeを指定するとundefinedと表示される
if defined?(a.hoge) then
	puts "defined"
else
	puts "undefined"
end

# 存在するプロパティを指定するとdefinedと表示される
if defined?(a.name) then
	puts "defined"
else
	puts "undefined"
end

# 値は入っていないけれど、attr_readerで指定しているプロパティを指定するとdefinedと表示される
if defined?(a.age) then
	puts "defined"
else
	puts "undefined"
end

参考リンク
Rubyに存在演算子は存在するの?

CakePHP3でプラグインを自作する

開発環境は、Windows 7 Professional(32bit)+XAMPP v3.22+CakePHP 3.6.4。

1.カレントディレクトリをアプリ内に設定して以下のコマンドを入力。今回は、プラグイン名はContactManagerとしておく。

bin\cake bake plugin ContactManager

・pluginsディレクトリ内にContactManagerディレクトリが作成されている。


参考リンク
プラグイン - 3.6
CakePHP3 プラグイン開発
CakePHP3でPluginを自作しようとしてハマる - ITの隊長のブログ