移転
http://taross-f.github.io 続きはこちら
C#6.0 get-only property スニペット
C#6.0でget-only propertyがありますね。
プロパティ - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
immutableなクラスをお手軽に作れる! ただし僕個人としてはプロパティはprop/propgのスニペットで入力派だったのに、get-onlyのsnippetデフォルトでついてこなくて悔しい! ので作りました。
get-only なので propgo
にしてみました
3D脱出ゲームでuGUIとカメラ移動
ちょっとした脱出ゲームみたいなのを作ろうとして、よくある2Dの部屋の画像をつなぐんでなくそのまま3D空間でやったら楽じゃないって思って、 どうせならカメラの切り替えもぱっと切り替わるんじゃなくてぐいっと動いたらいい感じじゃないかな、と思ってやってみました。
プラスせっかくなのでタップ判定は透明なUGUIボタンで拾えばいろいろ微調整しやすそうだし、Editorからの連携うまくさせたいなーなんて思ったり。 エディタ操作でいければ非エンジニアも触りやすいような気がして。ただし結構複雑になっちゃったのでアレですが。
とりあえずやってみた
中身
using UnityEngine; using System.Linq; using System.Collections; using System.Collections.Generic; // control camera transition public class CameraTransition : MonoBehaviour { // timespan to transition [SerializeField]float transitionSecond = 1; Dictionary<int, Camera> cameras = new Dictionary<int, Camera>(); int currentId; // default camera id const int DefaultId = 0; bool transiting; void Start () { // ensure that camera id is unique each other cameras = GameObject.FindObjectsOfType<CameraId>() .ToDictionary(x => x.Id, x => x.GetComponent<Camera>()); // ensure default id camera exist cameras.First(x => x.Key == DefaultId) .Value .gameObject .SetActive(true); cameras.Where(x => x.Key != DefaultId) .Select(x => x.Value) .ToList() .ForEach(x => x.gameObject.SetActive(false)); } public void Transit(int nextId) { if (nextId == currentId) return; if (transiting) return; StartCoroutine(TransitCore(nextId)); } private IEnumerator TransitCore(int nextId) { transiting = true; var currentCamera = cameras[currentId]; var originPosition = currentCamera.transform.position; var originRotation = currentCamera.transform.rotation; var nextCamera = cameras[nextId]; var elapsedTime = 0f; while (elapsedTime < transitionSecond) { elapsedTime += Time.deltaTime; currentCamera.transform.position = Vector3.Lerp(originPosition, nextCamera.transform.position, elapsedTime / transitionSecond); currentCamera.transform.rotation = Quaternion.Slerp(originRotation, nextCamera.transform.rotation, elapsedTime / transitionSecond); yield return null; } transiting = false; currentId = nextId; nextCamera.gameObject.SetActive(true); currentCamera.gameObject.SetActive(false); currentCamera.transform.position = originPosition; currentCamera.transform.rotation = originRotation; } }
対象カメラをStart()で拾ってくる→Transition()がきたらpositionとrotationをLerpする ってだけです。
Prefabsの中のCameraTransition
をヒエラルキーに入れればOKになってます。
でTransitionに使いたいカメラにCameraId.cs
をアタッチ。Idを0から振れば準備OK。
重複したりDefaultIdのカメラがないとエラーでます。
Tagつかったりとかもっと上手いこと出来そうですが…
using UnityEngine; // Attach to camera to be transitable public class CameraId : MonoBehaviour { [SerializeField]int id; public int Id { get { return id; } } }
あとはButtonのOnClick()にエディタからCameraTransitionのTransition()を選択して、遷移先のカメラIDを設定すると動きます。
ポイント
各カメラをあらかじめ配置しておいて、遷移するときに次のカメラの位置まで線形で移動→次のカメラActivate、位置戻してdeactivate。
uGUIのCanvasでScreenSpace camera 選択したものと組み合わせた脱出ゲーム的ゲーム前提での話にすると
macでユーザーグループを変更する
小ネタです。
最近brew update
とかbrew install hoge
で /usr/local
以下でPermission deniedがでて書き込めなかったことがありました。
確認したこと
/usr/local/hoge
系のディレクトリが 775, グループがwheel
groups user_name
wheelが入ってないことを確認。
/etc/group
でwheelにユーザー足してみる。
→結果変わらず…
なんでやねんってなってましたがmacだとユーザー管理が違うんですね。
正解
正しくはdscl
コマンドを使って以下のように。
sudo dscl . -append /Groups/wheel GroupMembership user_name
これやったあとはgroups user_name
にもwheelが出てくるようになります。
node.jsでtwitter apiを叩く
nodejsからtwitter api v1.1を叩きたいってなったのでやってみた。
node-twitterをインストール
npm install twitter
利用
各種keyは事前に取得しておきましょう。
var twitter = require('twitter'); var t = new twitter({ consumer_key: 'hoge', consumer_secret: 'hoge', access_token_key: 'hoge', access_token_secret: 'hoge' }); t.get('/search/tweets', { q: 'node' }, function (error, tweets, response) { console.log(tweets); });
REST APIだけ。StreamAPIは要件的に不要だったので。
ハマったポイントとしてはいくつか同じ内容の記事がググると出てくるんですが、get()のシグネチャ(正しくは第二引数のfunctionのシグネチャ)が変わったっぽいとこですね。 よくある記事だと第一引数にdataが入ってきてるようになってて上手く取れないなーってなってたんですが、2個目に取得したデータが入ってくるのでそれをとればいけました。
余談
この手のkey関連を含んだgithubのリポジトリに載せるときってみなさんどうやってるんですかね。 設定だけ抜き出して、bitbucketとかのプライベートリポジトリに置きつつ、デプロイ時にごにょごにょするってやろうと思ってますがありなのかな。もっとスマートなやり方もある気がする