Using Clojure with Unity3D inside Docker
I braced myself for a thorough hack to get Clojure working in Unity3D, and found that it’s already been done.
So, I instead spent my time implementing a subset of Flappy Bird.
When using Unity3D, I can imagine most of the work going into asset creation, story/level progression and play testing. This is the only real code I wrote:
A bird
(defcomponent Bird [^Vector2 force]
(Start [this]
(reset! score 0))
(Update [this]
(swap! score (fn [n] (+ n Time/deltaTime)))
(if (Input/anyKeyDown)
(.. this (GetComponent Rigidbody2D)
;; flap yer wings, bud!
(AddForce force ForceMode2D/Impulse))))
(OnCollisionEnter2D [this collision]
(if (= (.. collision gameObject tag) "Boundary")
(game-over))))
Move some pipes
(defcomponent MovingPipe [^float speed]
(Update [this] (pipe-update this)))
(defn +- []
(if (= 0 (rand-int 2))
+
-))
(defn pipe-update [^MovingPipe this]
(.. this transform (Translate (* (.speed this) Time/deltaTime)
0
0))
(if (< (.. this transform position x)
-1)
(set! (.. this transform position)
(Vector3. 1
((+-) ; fluctuating pipe heights
(.. this transform position y)
(* 0.3 (rand)))
0))))
Oh, and I did mention that I’m doing all of this inside Docker.