T=>

C#6.0 get-only property スニペット

C#6.0でget-only propertyがありますね。

プロパティ - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

immutableなクラスをお手軽に作れる! ただし僕個人としてはプロパティはprop/propgのスニペットで入力派だったのに、get-onlyのsnippetデフォルトでついてこなくて悔しい! ので作りました。

gist.github.com

get-only なので propgoにしてみました

3D脱出ゲームでuGUIとカメラ移動

ちょっとした脱出ゲームみたいなのを作ろうとして、よくある2Dの部屋の画像をつなぐんでなくそのまま3D空間でやったら楽じゃないって思って、 どうせならカメラの切り替えもぱっと切り替わるんじゃなくてぐいっと動いたらいい感じじゃないかな、と思ってやってみました。

プラスせっかくなのでタップ判定は透明なUGUIボタンで拾えばいろいろ微調整しやすそうだし、Editorからの連携うまくさせたいなーなんて思ったり。 エディタ操作でいければ非エンジニアも触りやすいような気がして。ただし結構複雑になっちゃったのでアレですが。

とりあえずやってみた

f:id:taro-furuya:20151103203046g:plain

github.com

中身

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を設定すると動きます。 f:id:taro-furuya:20151103204422j:plain

ポイント

各カメラをあらかじめ配置しておいて、遷移するときに次のカメラの位置まで線形で移動→次のカメラActivate、位置戻してdeactivate。

uGUIのCanvasでScreenSpace camera 選択したものと組み合わせた脱出ゲーム的ゲーム前提での話にすると

  • カメラをいっぱい配置してスクリプトつけてID振る、遷移もButton配置してエディタで設定→スクリプト自体をいじらなくて済むので、例えばちょっとUnity触ったことある非エンジニアがレベルデザインできそう。
  • UIをカメラごとに調整できるので該当カメラでの画面の調整がしやすいはず(たぶんRayとかでやると特定カメラだけ反応する、みたいなのの制御が逆にやっかいそう)

macでユーザーグループを変更する

f:id:taro-furuya:20151013220034j:plain

小ネタです。 最近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が出てくるようになります。

参考:http://nemoplus.hateblo.jp/entry/20090120/1232466123

node.jsでtwitter apiを叩く

f:id:taro-furuya:20151003172827j:plain

nodejsからtwitter api v1.1を叩きたいってなったのでやってみた。

node-twitterをインストール

github.com

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とかのプライベートリポジトリに置きつつ、デプロイ時にごにょごにょするってやろうと思ってますがありなのかな。もっとスマートなやり方もある気がする

はじめました

こんにちは。 つい先日30歳になったので、今更ながら技術系ブログをはじめてみることにしました。

自己紹介

30歳 男 六本木一丁目の会社でエンジニアのマネジメントやってます。 C# ASP.NET Unity

twitter Qiita github

なぜやるのか

  • 仕事じゃないプロジェクトが増えてきたのでそれの蓄積と共有
  • マネジメントをするようになって、仕事でコードを書く時間が減っているのでそのネタづくりに
  • 勉強会とかも最近ちょこちょこ行くようになったのでそれの蓄積
  • 名前を売る(少しでも有名な人がいるほうが会社にもよいよね
  • あわよくばチャリンチャリン

とりあえず

週一くらいは投稿できるようにしたいなあ