おはこんばんちわ!ギルガメです!
- プレイヤーをギルガメに変更
- UIをドット絵のボタンに変更(アセットストアで無料)
- ポイント獲得のモデルを「コイン」に変更(アセットストアで無料)
- モバイルでリリースするためにUIを全体的にモバイル用に変更
おはこんばんちわ!ギルガメです!
![]() |
ギルガメサバイバー |
おはこんばんちわ!ギルガメです!
最近好きなYoutuberがVampire Survivors(ヴァンパイアサバイバーズ)にハマっていてちょっとどういうものか作ってみたくなりました。
まだまだベースの部分ですが作ってみました。ヴァンパイアサバイバーズ自体は2Dですが3Dで作ってみました。時間ができたら2Dにしていこうかな。
やってみたことは下記になります。
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class CameraController : MonoBehaviour | |
{ | |
public Transform player; // プレイヤーのTransform | |
public Vector3 offset; // プレイヤーとカメラとのオフセット | |
public float smoothSpeed = 0.125f; // カメラの移動スムーズネス | |
void Start() | |
{ | |
// プレイヤーのTransformを見つける | |
player = GameObject.FindGameObjectWithTag("Player").transform; | |
} | |
void LateUpdate() | |
{ | |
// プレイヤーの現在位置にオフセットを加えた位置を計算 | |
Vector3 desiredPosition = player.position + offset; | |
// スムーズにカメラを移動 | |
Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed); | |
transform.position = smoothedPosition; | |
// プレイヤーを中央にキープ(角度は変更しない) | |
Vector3 lookAtPosition = player.position; | |
// transform.LookAt(lookAtPosition); | |
} | |
} |
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class EnemyController : MonoBehaviour | |
{ | |
public float health = 100.0f; | |
public float speed = 3.0f; | |
public float damage = 10.0f; // 敵のダメージ力 | |
public Transform player; | |
private float lastDamageTime = 0.0f; // 最後にダメージを与えた時間 | |
public float damageDelay = 1.0f; // ダメージを与える間隔(秒) | |
void Start() | |
{ | |
player = GameObject.FindGameObjectWithTag("Player").transform; | |
} | |
void Update() | |
{ | |
Vector3 direction = (player.position - transform.position).normalized; | |
transform.position += direction * speed * Time.deltaTime; | |
} | |
void OnTriggerStay(Collider other) | |
{ | |
if (other.gameObject.CompareTag("Player")) | |
{ | |
if (Time.time - lastDamageTime > damageDelay) | |
{ | |
PlayerController playerController = other.gameObject.GetComponent<PlayerController>(); | |
if (playerController != null) | |
{ | |
playerController.TakeDamage(damage); | |
lastDamageTime = Time.time; | |
} | |
} | |
} | |
} | |
public void TakeDamage(float damage) | |
{ | |
health -= damage; | |
if (health <= 0) | |
{ | |
Destroy(gameObject); | |
} | |
} | |
} |
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class EnemySpawner : MonoBehaviour | |
{ | |
public List<GameObject> enemyPrefabs; // 敵のプレファブのリスト | |
public float spawnRate = 5.0f; // 敵を生成する間隔(秒) | |
public float timeToChangeEnemy = 30.0f; // 敵の種類を変更する間隔(秒) | |
public float spawnDistance = 50.0f; // カメラからの敵の生成距離 | |
private float elapsedTime = 0.0f; // ゲーム開始からの経過時間 | |
private float lastSpawnTime = 0.0f; // 最後に敵を生成した時間 | |
private int currentEnemyIndex = 0; // 現在の敵のインデックス | |
void Update() | |
{ | |
elapsedTime += Time.deltaTime; | |
// 敵の種類を変更する時間が来た場合 | |
if (elapsedTime > timeToChangeEnemy * (currentEnemyIndex + 1) && currentEnemyIndex < enemyPrefabs.Count - 1) | |
{ | |
currentEnemyIndex++; | |
} | |
// 敵を生成する時間が来た場合 | |
if (elapsedTime - lastSpawnTime > spawnRate) | |
{ | |
SpawnEnemy(); | |
lastSpawnTime = elapsedTime; | |
} | |
} | |
void SpawnEnemy() | |
{ | |
// プレイヤーの位置を取得 | |
Vector3 playerPosition = Camera.main.transform.position; | |
// ランダムな方向を計算 | |
Vector3 randomDirection = Random.insideUnitSphere.normalized; | |
// カメラから一定の距離離れた位置を計算 | |
Vector3 spawnPosition = playerPosition + randomDirection * spawnDistance; | |
// Y座標を0.5fに設定して、敵が地面にいるようにする | |
spawnPosition.y = 0.5f; | |
// 敵を生成 | |
GameObject enemyToSpawn = enemyPrefabs[currentEnemyIndex]; | |
Instantiate(enemyToSpawn, spawnPosition, Quaternion.identity); | |
} | |
} |
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class PlayerController : MonoBehaviour | |
{ | |
public float speed = 5.0f; | |
public GameObject projectile; | |
public Transform firePoint; | |
public float health = 100.0f; // プレイヤーのHP | |
private Camera mainCamera; // シーン内のメインカメラ | |
void Start() | |
{ | |
mainCamera = Camera.main; // メインカメラを取得 | |
} | |
void Update() | |
{ | |
// マウスカーソルの方向を向く | |
LookAtCursor(); | |
} | |
void LookAtCursor() | |
{ | |
// マウスのスクリーン座標を取得 | |
Vector3 mousePosition = Input.mousePosition; | |
// マウスのスクリーン座標をワールド座標に変換 | |
Vector3 mouseWorldPosition = mainCamera.ScreenToWorldPoint(new Vector3(mousePosition.x, mousePosition.y, mainCamera.transform.position.y - transform.position.y)); | |
// プレイヤーがマウスカーソルの方向を向くように回転 | |
Vector3 directionToLook = mouseWorldPosition - transform.position; | |
directionToLook.y = 0; // y軸の回転は固定 | |
firePoint.transform.rotation = Quaternion.LookRotation(directionToLook); | |
float horizontalInput = Input.GetAxis("Horizontal"); | |
float verticalInput = Input.GetAxis("Vertical"); | |
Vector3 movement = new Vector3(horizontalInput, 0, verticalInput); | |
transform.Translate(movement * speed * Time.deltaTime); | |
// 左クリックで弾を発射 | |
if (Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0)) | |
{ | |
Instantiate(projectile, firePoint.position, firePoint.rotation); | |
} | |
} | |
public void TakeDamage(float damage) | |
{ | |
health -= damage; | |
if (health <= 0) | |
{ | |
// プレイヤーが死亡したときの処理(例:ゲームオーバー画面の表示) | |
Debug.Log("Player is dead!"); | |
} | |
} | |
} |
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class Projectile : MonoBehaviour | |
{ | |
public float speed = 10.0f; | |
public float damage = 20.0f; | |
void Update() | |
{ | |
// プロジェクトルを前方に移動 | |
transform.Translate(Vector3.forward * speed * Time.deltaTime); | |
// カメラの枠から出たかどうかをチェック | |
if (!IsObjectVisible(GetComponent<Renderer>())) | |
{ | |
Destroy(gameObject); | |
} | |
} | |
void OnTriggerEnter(Collider other) | |
{ | |
if (other.gameObject.CompareTag("Enemy")) | |
{ | |
Debug.Log("Hit enemy!"); | |
EnemyController enemy = other.gameObject.GetComponent<EnemyController>(); | |
if (enemy != null) | |
{ | |
enemy.TakeDamage(damage); | |
} | |
Destroy(gameObject); | |
} | |
} | |
// オブジェクトがカメラの視野内にあるかどうかを判定 | |
bool IsObjectVisible(Renderer renderer) | |
{ | |
Plane[] planes = GeometryUtility.CalculateFrustumPlanes(Camera.main); | |
return GeometryUtility.TestPlanesAABB(planes, renderer.bounds); | |
} | |
} |
おはこんばんちわ!ギルガメです!
Unity3DとUnreal Engine 5のどちらが良いか比較
• はじめに
• Unity3DとUnreal Engine 5とは
• 使いやすさ
• グラフィックス
• 機能と機能拡張
• パフォーマンス
• アセットストア
• 結論
はじめに
はじめまして!今日はUnity3DとUnreal Engine 5の比較についてお話ししましょう。両方のゲームエンジンは非常に人気がありますが、どちらが良いのでしょうか?興味がある方にとっては重要なテーマですよね。
Unity3DとUnreal Engine 5は、ゲーム開発において非常に強力なツールです。どちらも独自の機能や特徴を持っており、数多くの成功作品を生み出しています。しかし、それぞれに違いもありますので、一つ一つ見ていきましょう。
まずはUnity3Dの概要から始めましょう。Unity3Dは非常に使いやすいインターフェースを持っており、初心者でも比較的簡単にゲーム開発を始めることができます。また、コミュニティも非常に広く活発であり、様々な情報やサポートを得ることができます。
一方、Unreal Engine 5の概要です。Unreal Engine 5は非常に強力なグラフィックスや物理エンジンを持っており、リアルなゲーム体験を実現することができます。また、インベントリシステムやAI機能など、幅広い機能が用意されています。
どちらが使いやすいかという点では、Unity3Dが初心者にとっては優れているかもしれません。しかし、Unreal Engine 5のグラフィックスや物理エンジンの強力さを考えると、それ以上の努力をする価値があるかもしれません。
さて、使いやすさについてはこんな感じです。次はグラフィックスについて見ていきましょう。それではお楽しみに!
Unity3DとUnreal Engine 5とは
Unity3DとUnreal Engine 5、どちらがいいのか悩んでいる人も多いはずです。それぞれのゲームエンジンの特徴や性能を比較して、最適な選択肢を見つけてみましょう。
Unity3Dの概要
まずはじめに、Unity3Dは非常にポピュラーなゲームエンジンです。多くのデベロッパーがUnity3Dを使ってゲームを作っており、その人気の理由は何でしょうか?まずはその使いやすさです。Unity3Dは初心者でも比較的簡単に学べるため、プログラミングの経験がなくてもゲームを作ることができます。
また、Unity3Dには豊富なアセットストアがあります。ここでは、様々なアセットやリソースをダウンロードして使用することができます。これにより、素材作りに時間をかけずにゲーム制作に集中することができます。
Unreal Engine 5の概要
次にUnreal Engine 5です。Unreal Engine 5は、高品質なグラフィックスとパワフルな機能で知られています。映画のようなリアルなグラフィックスを再現することができるため、リアリティのあるゲームを作りたい場合には最適です。
また、Unreal Engine 5は豊富な機能と機能拡張があります。プロジェクトに必要なツールや機能が揃っているため、作業効率を高めることができます。さらに、Unreal Engine 5は大規模なプロジェクトにも対応しており、複数の開発者が同時に作業することができます。
どちらを選ぶべきか?
さて、Unity3DとUnreal Engine 5のどちらを選ぶべきか迷っている方には、以下のポイントを考慮することをおすすめします。
使いやすさ:Unity3Dは初心者に優しいですが、Unreal Engine 5はより高度な機能を提供しています。プログラミングの経験や技術力によって選ぶべきエンジンは異なるかもしれません。
グラフィックス:Unreal Engine 5はリアルなグラフィックスを実現できるため、映画のような演出をしたい場合にはおすすめです。一方、Unity3Dはカートゥーン風やシンプルなグラフィックスを好む人に向いています。
機能と機能拡張:Unreal Engine 5は機能が豊富であり、大規模なプロジェクトにも対応しています。一方、Unity3Dは初心者でも使いやすく、シンプルなプロジェクトに最適です。
パフォーマンス:Unity3Dは軽量なエンジンであり、様々なプラットフォームで動作することができます。Unreal Engine 5はグラフィックスに重点を置いているため、高スペックなPCやコンソールでの利用がおすすめです。
アセットストア:Unity3Dのアセットストアは非常に充実しており、必要な素材やリソースを手に入れやすいです。Unreal Engine 5のアセットストアも豊富ではありますが、Unity3Dほど幅広い品揃えはありません。
以上のポイントを考慮して、自分のプロジェクトや目標に合ったゲームエンジンを選ぶことが重要です。どちらを選んでも素晴らしいゲームを作ることができるので、自分の好みや目的に合ったエンジンを選んでみてください。
さて、このUnity3DとUnreal Engine 5の比較は、いかがでしたか?両方のエンジンにはそれぞれ利点と欠点がありますが、あなたのニーズに合った方を選ぶことが大切です。どちらのエンジンを選んでも、あなたのクリエイティビティで素晴らしいゲームを作ることができるはずです。 Happy coding and gaming!
使いやすさ
Unity3DとUnreal Engine 5のどちらが良いか比較
はじめに:
Unity3DとUnreal Engine 5のどちらを選ぶべきか、迷っている人も多いことでしょう。どちらを選ぶかは、あなたの個人的な好みやプロジェクトのニーズによって異なります。そこで、この比較記事では、両方のエンジンの使いやすさ、グラフィックス、機能と機能拡張、パフォーマンス、アセットストアなどの側面を検討してみましょう。
Unity3DとUnreal Engine 5とは:
まずはじめに、Unity3DとUnreal Engine 5の概要を知っておきましょう。Unity3Dは、使いやすくて初心者にもおすすめのゲームエンジンです。一方、Unreal Engine 5は、高度なグラフィックスとパフォーマンスを提供することで知られています。どちらも有名なエンジンであり、大規模なプロジェクトにも対応しています。
使いやすさ:
さて、最初の比較項目は「使いやすさ」です。Unity3Dはシンプルなインターフェースと使いやすさが売りです。初めてのプロジェクトには最適で、ドラッグ&ドロップの操作や直感的な編集機能があるため、プログラミングの経験がない人でも簡単に学ぶことができます。
一方、Unreal Engine 5は少し学習コストがかかるかもしれません。複雑なツールセットやプログラミング言語(BlueprintやC++)を使いますが、その分高度なカスタマイズやパフォーマンスが可能です。プログラマーやテクニカルな人にとっては魅力的かもしれませんが、初心者には少しハードルが高いかもしれません。
両エンジンの使いやすさでは、Unity3Dが初心者向けに優れていると言えるでしょう。誰でも簡単に使い始めることができるので、手軽にゲーム開発を始めたい人には最適です。一方、Unreal Engine 5はより高度な機能を求めるプロジェクトに向いていて、技術的なチャレンジを求める人にはピッタリです。
グラフィックス
グラフィックスはUnity3DとUnreal Engine 5の比較で重要なポイントです。まずはUnity3Dのグラフィックスから始めましょう。
Unity3Dのグラフィックスは非常に強力であり、美しいビジュアルを作り出すことができます。リアルな照明効果や質感表現、そして多様なエフェクトなど、開発者が求めるさまざまな要素を提供しています。また、Unity3Dはシェーダーラボを使用して独自のシェーダープログラミングも行えます。これにより、より高度なグラフィックス表現を実現することができます。
一方、Unreal Engine 5のグラフィックスも驚くべきものです。この新バージョンでは、Naniteと呼ばれる技術が導入され、ゲーム内のオブジェクトや環境の詳細な表現が可能になりました。また、光の反射や影、粒子エフェクトなど、写実的な表現も容易に実現できます。Unreal Engine 5は、映画やアニメのようなクオリティのグラフィックスを実現するために設計されています。
どちらのエンジンも優れたグラフィックスを提供していますが、その違いは開発者のニーズによります。Unity3Dは柔軟性があり、幅広いプラットフォームに対応しています。また、開発プロセスが迅速であり、リソース効率も優れています。Unreal Engine 5は、よりリアルなビジュアルを求める場合に特に優れていますが、コストやパフォーマンスの点で注意が必要です。
要するに、Unity3DとUnreal Engine 5のどちらが優れているかは、開発者のニーズと制約によります。どちらのエンジンでも素晴らしいグラフィックスが作れるし、どちらも利点があります。開発者は自分のプロジェクトのニーズに合わせて最適なエンジンを選択すべきです。
さぁ、次は機能と機能拡張の比較です。楽しみにしていてくださいね!
機能と機能拡張
Unity3Dの機能と機能拡張は非常に多岐にわたります。まず、Unity3Dはマルチプラットフォーム対応の開発に優れています。この機能により、あなたは同じコードを使用して、さまざまなデバイスやプラットフォーム向けにゲームやアプリを開発できます。
さらに、Unity3Dは強力なエディタを提供しています。エディタは、ビジュアルに直感的な方法でシーンを作成し、オブジェクトやエフェクトを配置することができます。また、スクリプトを使ってゲームのロジックを実装することもできます。エディタの柔軟性は、開発者が自分のビジョンを実現するために必要なツールを提供しています。
また、Unity3Dは豊富なアセットストアを持っています。ここでは、さまざまなアセットパッケージやプラグインを見つけることができます。これにより、開発者は再利用可能なコンテンツや機能を容易に追加できます。アセットストアは、開発者が時間と労力を節約し、効果的な開発を行うための重要な要素です。
一方、Unreal Engine 5の機能と機能拡張も非常に印象的です。これには、リアルなグラフィックスと物理シミュレーションが含まれます。Unreal Engine 5は、フォトリアルなビジュアルを作成するための高度なツールとエフェクトを提供します。また、物理シミュレーションにより、リアルな振る舞いや衝突を実現することができます。
さらに、Unreal Engine 5はビジュアルスクリプティングツールであるBlueprintを提供しています。Blueprintは、プログラミングの知識がない開発者でもゲームのロジックを構築できるようにするものです。これにより、プログラミングに自信のない人でもゲームを開発することができます。
また、Unreal Engine 5はハイエンドのパフォーマンスを提供します。強力な最適化機能により、大規模なプロジェクトでもスムーズに動作します。また、Unreal Engine 5はVRおよびARのサポートも提供しており、新たな領域への進出を支援します。
さて、どちらが優れているかはあなた次第です。Unity3Dは使いやすさと柔軟性を提供し、アセットストアの利便性もあります。一方、Unreal Engine 5はリアルなグラフィックスや物理シミュレーション、ハイエンドのパフォーマンスなどを提供します。
あなたが開発するプロジェクトの要件と優先事項に基づいて、最適な選択肢を選んでください。どちらを選んでも、素晴らしい結果が得られることでしょう。それでは、開発の成功をお祈りしています!
パフォーマンス
えーと、パフォーマンスですね。ユニティちゃん(Unity3D)とアンリアルちゃん(Unreal Engine 5)の力比べです!いいですね、ちょっと両者のパフォーマンスを比較してみましょう!
ユニティちゃんは持ち歩きもできるし、何食べたいかも選べる優れもの!マルチプラットフォーム対応で、どんなデバイスでも動かせるというところがすごいですよね。それにクロスプラットフォームでの開発も可能で、面倒な移植作業が不要ってのもありがたいです。パフォーマンスは結構良いですが、他のグラフィックエンジンと比べると若干物足りなさを感じるかもしれませんね。
それに対して、アンリアルちゃんは専用機特化型の美女!リアルなグラフィックスと高いパフォーマンスがウリです。まるで映画のような臨場感を演出してくれるんですよ。ただ、専用機に特化しているせいか、他のデバイスへの移植がやや面倒かもしれませんね。でもパフォーマンスはかなり優れているといえます。
まとめると、ユニティちゃんはマルチプラットフォーム対応で手軽ですが、グラフィックスにやや物足りなさを感じるかもしれません。一方、アンリアルちゃんは美しいグラフィックスと高いパフォーマンスを持っていますが、専用機特化なので他のデバイスには不向きかもしれません。それに、実際どっちがいいかは自分の好み次第ですから、どちらが良いかはあなた次第です!
では、この辺で切り上げたいと思います。次はアセットストアについてお伝えしますね! それでは、お楽しみに!
アセットストア
Unity3DのアセットストアとUnreal Engine 5のアセットストアを比較すると、個人的に言えば、どちらのエンジンもユニークな利点を提供しています。まず、Unity3Dのアセットストアでは、豊富なアセットライブラリを見つけることができます。ゲームオブジェクト、キャラクターモデル、環境アセットなど、あらゆるものが揃っています。しかも、多くのアセットはフリーか低価格で提供されているため、制作コストを抑えることができます。また、Unity3Dのアセットストアでは、アセットがユーザーレビューに基づいて評価されていますので、品質の高いものを選ぶことができます。
一方、Unreal Engine 5のアセットストアは、より高品質でリアルなアセットを提供しています。3Dモデル、テクスチャ、エフェクトなど、ゲームのビジュアル面を強化するための幅広いリソースが揃っています。Unreal Engine 5は、映画のようなグラフィックスを実現することができるので、これらのアセットはプロジェクトに本当に価値をもたらします。また、Unreal Engine 5のアセットストアでは、エディタ内でのプレビューやアセットの統合がシームレスにできるため、制作プロセスをスムーズに進めることができるでしょう。
どちらのアセットストアも特徴的で使いやすいですが、Unity3Dのアセットストアは利用可能なアセットの幅広さと低価格なアセットの多さにおいて優れています。一方、Unreal Engine 5のアセットストアは、高品質でリアルなアセットを求める場合には非常に便利です。どちらを選ぶかは、プロジェクトのニーズや個人の好みによるでしょう。
結論
Unity3DとUnreal Engine 5、どちらを選ぶか結論を出していこう。両方のプラットフォームは魅力的な特徴を持っているぞ。まず、Unity3Dは使いやすさがウリだ。初心者でも手軽に学び始められるし、コードの知識がなくても簡単なゲームアプリを作ることができる。
一方で、Unreal Engine 5は高度なグラフィックス表現が可能で、リアリティのある世界を作り上げるのに適している。特に、大規模なプロジェクトに向いていると言えるだろう。
また、機能と機能拡張に関しては、Unity3Dは多機能なエディターとアセットストアが魅力で、幅広いリソースを利用できる。一方、Unreal Engine 5は強力なビジュアルスクリプティングと革新的な機能拡張が特徴だ。
パフォーマンス面では、Unity3Dは軽量なゲームに適しているが、Unreal Engine 5はリッチなゲームに向いている。最後に、アセットストアについては、Unity3Dのほうが充実しており、幅広いアセットが手に入る。ここまで見てきたように、Unity3DとUnreal Engine 5はそれぞれ得意とする分野が異なるので、個々のニーズに合わせて選ぶべきだ。では、どちらを選ぶかは君次第だ!
おはこんばんちわ!ギルガメです!
using UnityEngine; | |
using UnityEngine.SceneManagement; | |
using TMPro; | |
public class GameManager : MonoBehaviour | |
{ | |
public bool isGameOver = false; | |
public TextMeshProUGUI scoreText; | |
public TextMeshProUGUI timerText; | |
public Stage[] stages; | |
private bool isRunning = false; | |
private int score = 0; | |
private float startTime = 0f; | |
private PlayerController playerController; | |
private ObstacleSpawner obstacleSpawner; | |
private int currentStage = 0; | |
void Start() | |
{ | |
startTime = Time.time; | |
isRunning = true; | |
playerController = GameObject.Find("Player").GetComponent<PlayerController>(); | |
obstacleSpawner = GameObject.Find("ObstacleManager").GetComponent<ObstacleSpawner>(); | |
} | |
void Update() | |
{ | |
if (isGameOver) | |
{ | |
RestartGame(); | |
} | |
if (isRunning) | |
{ | |
float elapsedTime = Time.time - startTime; | |
int seconds = (int)elapsedTime; | |
timerText.text = seconds.ToString(); | |
if (stages.Length > currentStage && seconds > stages[currentStage].nextStage) | |
{ | |
playerController.speed = stages[currentStage].PlayerSpeed; | |
obstacleSpawner.spawnRate = stages[currentStage].ObstacleSpeed; | |
currentStage++; | |
} | |
} | |
} | |
public void GameOver() | |
{ | |
isGameOver = true; | |
} | |
void RestartGame() | |
{ | |
SceneManager.LoadScene(SceneManager.GetActiveScene().name); | |
} | |
// ポイントを取得したらスコアを加算 | |
public void UpdateScore(int point = 1) | |
{ | |
score = score + point; | |
scoreText.text = score.ToString(); | |
} | |
} |
using UnityEngine; | |
public class ObstacleSpawner : MonoBehaviour | |
{ | |
public GameObject obstaclePrefab; | |
public GameObject pointPrefab; | |
public float spawnRate = 2.0f; | |
private float spawnInterval; | |
void Start() | |
{ | |
Invoke("SpawnObstacle", 2.0f); | |
} | |
void SpawnObstacle() | |
{ | |
spawnInterval = Random.Range(0.5f, spawnRate); | |
if (Random.Range(0, 2) == 0) { | |
Instantiate(obstaclePrefab, new Vector3(Random.Range(-1, 2) * 2, Random.Range(0, 2) + 0.6f, transform.position.z), Quaternion.identity); | |
} else { | |
Instantiate(pointPrefab, new Vector3(Random.Range(-1, 2) * 2, Random.Range(0, 2) + 0.6f, transform.position.z), Quaternion.identity); | |
} | |
Invoke("SpawnObstacle", spawnInterval); | |
} | |
} |
using UnityEngine; | |
public class PlayerController : MonoBehaviour | |
{ | |
public float speed = 10.0f; | |
public float jumpForce = 5.0f; | |
private Rigidbody rb; | |
private int lane = 1; // 0: 左, 1: 中央, 2: 右 | |
private Vector3[] lanePositions = { new Vector3(-2, 1, 0), new Vector3(0, 1, 0), new Vector3(2, 1, 0) }; | |
private Vector3 targetPosition; // プレイヤーが移動する目的地 | |
private bool isGrounded = true; // プレイヤーが地面にいるかどうか | |
void Start() | |
{ | |
rb = GetComponent<Rigidbody>(); | |
targetPosition = transform.position; // 初期位置を設定 | |
} | |
void Update() | |
{ | |
// レーン切り替え | |
if ((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) && lane > 0) | |
{ | |
lane--; | |
SwitchLane(); | |
} | |
else if ((Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) && lane < 2) | |
{ | |
lane++; | |
SwitchLane(); | |
} | |
// ジャンプ(地面にいる場合のみ) | |
if (Input.GetButtonDown("Jump") && isGrounded) | |
{ | |
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse); | |
isGrounded = false; // ジャンプ後は地面から離れる | |
} | |
// スムーズなレーン切り替え(X座標のみ) | |
Vector3 newPosition = transform.position; | |
newPosition.x = Mathf.Lerp(newPosition.x, targetPosition.x, speed * Time.deltaTime); | |
transform.position = newPosition; | |
// 前進(Z座標) | |
transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World); | |
} | |
void SwitchLane() | |
{ | |
targetPosition = lanePositions[lane]; | |
targetPosition.z = transform.position.z; // Z座標は変更しない | |
} | |
private void OnTriggerEnter(Collider other) | |
{ | |
// ゲームオーバー | |
if (other.gameObject.tag == "Obstacle") | |
{ | |
FindObjectOfType<GameManager>().GameOver(); | |
} | |
// スコア加算 | |
else if (other.gameObject.tag == "Point") | |
{ | |
FindObjectOfType<GameManager>().UpdateScore(); | |
Destroy(other.gameObject); | |
} | |
} | |
void OnCollisionEnter(Collision collision) | |
{ | |
// 地面に触れたらisGroundedをtrueにする | |
if (collision.gameObject.CompareTag("Ground")) | |
{ | |
isGrounded = true; | |
} | |
} | |
} |
using System; | |
[Serializable] | |
public class Stage | |
{ | |
public int nextStage = 0; | |
public int PlayerSpeed = 0; | |
public float ObstacleSpeed = 0; | |
} |
引越しが落ち着いたので久々にゲームを開発していきたいと思います。
かなりのブランクがあるので簡単なエンドレスランナーのゲームを作っていきます。
できるだけコードも忘れないように記入していきたいので、もしこうした方がいいなどありましたら指摘していただけると幸いです!
今期は下記を目標に作っていきます。
簡単に遊べるエンドレスランナーの基礎の基礎を作っていきます。
まずやったこと:
using UnityEngine; | |
using UnityEngine.SceneManagement; | |
public class GameManager : MonoBehaviour | |
{ | |
public bool isGameOver = false; | |
void Update() | |
{ | |
if (isGameOver) | |
{ | |
RestartGame(); | |
} | |
} | |
public void GameOver() | |
{ | |
isGameOver = true; | |
} | |
void RestartGame() | |
{ | |
SceneManager.LoadScene(SceneManager.GetActiveScene().name); | |
} | |
} |
using UnityEngine; | |
public class CameraFollow : MonoBehaviour | |
{ | |
public Transform target; // カメラが追従する対象(プレイヤー) | |
public Vector3 offset; // カメラとプレイヤーの相対位置 | |
void Update() { | |
// プレイヤーの位置にオフセットを加えてカメラの位置を更新 | |
transform.position = new Vector3(transform.position.x, offset.y + offset.y, target.position.z + offset.z); | |
transform.LookAt(target); | |
} | |
} |
using UnityEngine; | |
public class Obstacle : MonoBehaviour | |
{ | |
private GameObject player; // プレイヤーオブジェクト | |
public float threshold = -5.0f; // このZ座標を過ぎたら障害物を削除 | |
void Start() | |
{ | |
player = GameObject.Find("Player"); | |
} | |
void Update() | |
{ | |
// プレイヤーのZ座標よりも後ろにある(小さい)場合、障害物を削除 | |
if (transform.position.z < player.transform.position.z + threshold) | |
{ | |
Destroy(gameObject); | |
} | |
} | |
} |
using UnityEngine; | |
public class ObstacleSpawner : MonoBehaviour | |
{ | |
public GameObject obstaclePrefab; | |
public float spawnRate = 2.0f; | |
private float spawnInterval; | |
void Start() | |
{ | |
Invoke("SpawnObstacle", 2.0f); | |
} | |
void SpawnObstacle() | |
{ | |
spawnInterval = Random.Range(0.5f, spawnRate); | |
Instantiate(obstaclePrefab, new Vector3(Random.Range(-1, 2) * 2, Random.Range(0, 2) + 0.6f, transform.position.z), Quaternion.identity); | |
Invoke("SpawnObstacle", spawnInterval); | |
} | |
} |
using UnityEngine; | |
public class PlaneFollow : MonoBehaviour | |
{ | |
public Transform target; | |
void Update() { | |
transform.position = new Vector3(transform.position.x, transform.position.y, target.position.z); | |
} | |
} |
using UnityEngine; | |
public class PlayerController : MonoBehaviour | |
{ | |
public float speed = 10.0f; | |
public float jumpForce = 5.0f; | |
public float laneSwitchSpeed = 0.5f; // レーン切り替えの速度 | |
private Rigidbody rb; | |
private int lane = 1; // 0: 左, 1: 中央, 2: 右 | |
private Vector3[] lanePositions = { new Vector3(-2, 1, 0), new Vector3(0, 1, 0), new Vector3(2, 1, 0) }; | |
private Vector3 targetPosition; // プレイヤーが移動する目的地 | |
private bool isGrounded = true; // プレイヤーが地面にいるかどうか | |
void Start() | |
{ | |
rb = GetComponent<Rigidbody>(); | |
targetPosition = transform.position; // 初期位置を設定 | |
} | |
void Update() | |
{ | |
// レーン切り替え | |
if ((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) && lane > 0) | |
{ | |
lane--; | |
SwitchLane(); | |
} | |
else if ((Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) && lane < 2) | |
{ | |
lane++; | |
SwitchLane(); | |
} | |
// ジャンプ(地面にいる場合のみ) | |
if (Input.GetButtonDown("Jump") && isGrounded) | |
{ | |
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse); | |
isGrounded = false; // ジャンプ後は地面から離れる | |
} | |
// スムーズなレーン切り替え(X座標のみ) | |
Vector3 newPosition = transform.position; | |
newPosition.x = Mathf.Lerp(newPosition.x, targetPosition.x, laneSwitchSpeed * Time.deltaTime); | |
transform.position = newPosition; | |
// 前進(Z座標) | |
transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World); | |
} | |
void SwitchLane() | |
{ | |
targetPosition = lanePositions[lane]; | |
targetPosition.z = transform.position.z; // Z座標は変更しない | |
} | |
private void OnTriggerEnter(Collider other) | |
{ | |
// ゲームオーバー | |
if (other.gameObject.tag == "Obstacle") | |
{ | |
FindObjectOfType<GameManager>().GameOver(); | |
} | |
} | |
void OnCollisionEnter(Collision collision) | |
{ | |
// 地面に触れたらisGroundedをtrueにする | |
if (collision.gameObject.CompareTag("Ground")) | |
{ | |
isGrounded = true; | |
} | |
} | |
} |
React Nativeは、Facebookが作成したオープンソースのモバイルアプリケーションフレームワークであり、JavaScriptでAndroidとiOSアプリを作ることができます。Expoは、React Nativeのビルドや開発を支援するサービスであり、簡単に開発環境が構築できます[1][2][3].
Expoは、クロスプラットフォーム(iOS/Android/Web)でReact Nativeアプリを開発するための便利機能を集めたプラットフォームであり、素のReact Nativeプロジェクトと比較して若干の制約があるが、Expo SDKが提供する様々な機能を使えたり、開発環境の整備が簡単というメリットがあります[1].
Expoを使用すると、実機、iOS、Android両シミュレータをローカルで立ち上げてコードを編集保存したら即時反映させることができます。また、Expoアプリをインストールすることで、自分で作成したコードを実機で確認することもできます[3].
React NativeとExpoを使用してアプリを開発するには、以下の手順が必要です[1][2][3]:
1. Node.jsとnpmのインストール
2. Expo CLIのインストール
3. Expoアカウントの作成
4. 開発環境のインストール(Xcode、Android Studio、JDKなど)
5. Expoプロジェクトの作成
以上の手順を実行することで、React NativeとExpoを使用したアプリの開発環境を構築することができます。
React NativeとExpoを使用してアプリを開発することで、ネイティブアプリと同じようなユーザーエクスペリエンスを提供することができます。また、React Nativeは、Web開発で用いられるReactをもとに開発されているため、Webエンジニアでも学習コストが低いと言われています[4].
以上のように、React NativeとExpoを使用することで、簡単にクロスプラットフォームのアプリを開発することができます。
[1] https://zenn.dev/username/articles/2021-12-25-9b543d55e9ff81afff09
[2] https://rocksystem6611.hatenablog.com/entry/reactnative01
[3] https://zenn.dev/yuyaamano23/articles/dad35355a30036
[4] https://cloud.tencent.com/developer/article/1667243
React NativeとExpoを使ったアプリ開発
React Nativeは、JavaScriptのReactライブラリを利用してiOSやAndroid向けのアプリを開発することができるクロスプラットフォームのモバイルアプリケーションフレームワークです。React NativeにExpoをプラスすることで、初めてのモバイルアプリ開発にもおすすめできます。ExpoはReact Nativeを使ったアプリ開発をシンプルにしてくれるツールセットで、アプリ開発初心者にとってはデメリットよりもメリットの方が大きいとされています[1]。
React NativeとExpoを使って、以下のようなアプリを開発することができます。
- ソーシャルネットワークアプリ
- オンラインストアアプリ
- メディアアプリ
- ゲームアプリ
- ツールアプリ
React Nativeは、Reactの主な機能をReact Nativeでも同じように扱うことができます。使用言語は当然JavaScript(またはTypeScript)なので、Reactを使ったWebアプリ制作経験者であれば、学習コストは限りなく低く抑えられると思います[1].
Expoを使うことで、React Nativeアプリの開発がより簡単になります。Expoは、React Nativeアプリのビルドや開発を支援してくれるサービスで、オンラインまたはLinux、Mac、Windowsアプリとして使用することができます[2].
React NativeとExpoを使ったアプリ開発には、Node.jsの最新版が必要です。また、モバイルアプリをシミュレートするためのデバイス(スマホやタブレット等)を持っていることが前提条件となります[1].
以上のように、React NativeとExpoを使って、様々な種類のモバイルアプリを開発することができます。初めてのモバイルアプリ開発には、React NativeにExpoをプラスすることで、開発を始めるためのハードルをかなり下げることができるため、おすすめです[1].
参考文献
- [1] [React Native(+Expo)でモバイルアプリの開発環境を構築しよう! - Webで遊ぼ!](https://web-de-asobo.net/react-native-expo/)
- [3] [React Native Expoを利用したモバイルアプリの開発基礎 入門編 - アールエフェクト](https://reffect.co.jp/react-native/react-native-expo)
- [4] [ゼロから始める React Native + Expo 入門 - Zenn](https://zenn.dev/akira_kido/articles/9e4e8a2f6d7a9a)
- [2] [Expoでアプリを作る 【これからはじめるReact Native】 - bagelee(ベーグリー)](https://bagelee.com/programming/react-native/expo/)
• イントロダクション
• Next.js 13 における最適なプラクティス
• ユーザーフレンドリーなライブラリの紹介
• パフォーマンスチューニング
• サンプルプロジェクトの紹介
• 結論
Next.jsは、Reactアプリケーション用のフレームワークで、サーバーサイドレンダリング、静的サイト生成、APIルート機能を提供します。Next.js 13は、Next.jsフレームワークの最新バージョンであり、Webアプリケーションをよりパフォーマンス向上させる様々な最適化機能を提供します。
このブログの目的は、Next.js 13の最適なプラクティスとユーザーフレンドリーなライブラリを紹介することです。読者は、サイトの最適化やパフォーマンス向上のための有用な情報を得ることができます。 React開発者にとって、Next.jsは非常に使いやすく、簡単なアプリケーションから大規模なプロジェクトまで柔軟に対応できます。Next.js 13の新しい機能には、ビルドタイムの最適化、ユーザーエクスペリエンスの改善、SEOの向上などがあります。
イントロダクション Next.jsはReactベースのオープンソースWebアプリケーションフレームワークです。Next.js 13は、優れたユーザーエクスペリエンスを提供するためにいくつかの最適化が施されています。 このブログの目的は、Next.js 13の最適なプラクティスとユーザーフレンドリーなライブラリの紹介です。
Next.js 13 における最適なプラクティス Next.js 13では、静的アセットの最適化、キャッシュの最適化、サーバーサイドレンダリングの最適化が重要です。 静的アセットの最適化は、サイトの読み込み時間を短縮し、ユーザーエクスペリエンスを向上するために必要です。 Next.js 13では、Image Componentが導入され、画像の最適化が容易になりました。このComponentは、クライアントとサーバーの両方で最適な画像を自動的に選択し、表示します。 キャッシュの最適化は、サイトのパフォーマンスを向上させるために必要です。
Next.js 13では、ブラウザのキャッシュを有効にし、サイトのレスポンス時間を短縮することができます。 サーバーサイドレンダリングの最適化は、SEO最適化のために不可欠です。 Next.js 13では、ISR(Incremental Static Regeneration)が可能になり、ページの更新が柔軟になりました。これにより、検索エンジンでのサイトのランキングが改善されます。 ユーザーフレンドリーなライブラリの紹介 Next.js 13では、SWR、React Query、Framer Motionなどのユーザーフレンドリーなライブラリが導入されています。これらのライブラリは、高度なユーザーエクスペリエンスの実現に役立ちます。 SWRは、APIのフェッチングを容易にし、キャッシュと自動更新機能を提供します。React Queryは、クエリのキャッシュと並列フェッチをサポートしています。Framer Motionは、アニメーション効果を容易に追加することができ、サイトの魅力度を上げます。 パフォーマンスチューニング ビルド時間の最適化、ユーザー体験の最適化、SEOの最適化が重要です。 ビルド時間の最適化には、Vercel上でのビルド時間の短縮が役立ちます。ユーザー体験の最適化には、サイトの読み込み時間の短縮が重要です。データの最小化や、最適な画像の使用が有効です。 SEOの最適化には、重要な要素として、titleタグ、metaデータ、OG tagsがあります。これらのタグを使い、各頁ごとに適切な設定を行うことが必要です。
サンプルプロジェクトの紹介 Next.js 13では、シンプルなサンプルプロジェクトが用意されています。これを活用して、ローカル開発環境の構築、コンポーネントの実装方法、プロダクション環境へのデプロイ方法を学ぶことができます。 結論 Next.js 13は、高度なユーザーエクスペリエンスを提供するための最適なフレームワークです。このブログで紹介した最適なプラクティスやユーザーフレンドリーなライブラリを活用し、高性能のWebアプリケーションを開発してみてはいかがでしょうか。
Next.js 13における最適なプラクティスとユーザーフレンドリーなライブラリの紹介の一環として、機能的で使いやすいライブラリの紹介を行います。
今回は SWR、React Query、Framer Motion に焦点を当ててみます。
SWRは、データのフェッチングとキャッシュ管理のための簡単な React Hooks ライブラリです。サーバーサイドレンダリング (SSR) に最適化されているため、非同期データのフェッチやキャッシュに問題が発生しないことが保証されます。なお、このライブラリにはTypeScriptサポートがあります。
React Query は、高速な UI レスポンスと優れたキャッシュ機能を提供するフルフィーチャーのライブラリです。このライブラリはデータの同期管理を行うための「クエリ」という概念に基づいています。また、このライブラリにはReact Nativeでも利用できるアダプターがあります。
Framer Motion は、シンプルな API と直感的なコンポーネントを使用して、アニメーションを簡単に作成できます。100を超えるプリセットをリリースしており、Reactとの互換性にも優れています。さらに、Framer MotionにはTypeScriptサポートがあります。 これらのライブラリは、Next.js 13で最適なパフォーマンスを発揮するように設計されており、手軽かつ効果的に使用することができます。ぜひ、プロジェクトに取り入れてみてください。
Next.js 13 における最適なプラクティスとユーザーフレンドリーなライブラリの紹介 イントロダクション Next.jsはReactフレームワークであり、Reactアプリケーションを構築するためのフルスタックソリューションです。
Next.js 13では、パフォーマンス、開発ツール、ユーザー体験に改良が入っています。このブログでは、Next.js 13の新機能と最適な開発プラクティス、ユーザーフレンドリーなライブラリ、サンプルプロジェクトの紹介を行います。 パフォーマンスチューニング ビルド時間の最適化、ユーザー体験の最適化、SEOの最適化に取り組みましょう。 ビルド時間の最適化 Next.js 13では、プリコンパイル処理があり、APIルートのコンパイル時間が短縮されます。また、プラグインやフレームワークを構成する際に、必要なライブラリのみをインストールするようにして、無駄なパッケージの読み込みを防止しましょう。
ユーザー体験の最適化 Next.js 13では、新しい画像コンポーネント(Image)を導入し、画像の自動最適化を行えるようになりました。 また、PrefetchやLazy Loadingを使って、ページリロードの必要性を下げ、スムーズなサイト体験を提供しましょう。 SEOの最適化 Next.js 13では、SEOのための機能を強化することができます。 サイトマップ自動生成ツールによって、情報を追加しなくても、新しいページが自動登録されます。
さらに、Next.js 13は、ページ内のリンク先ページの内容も読み込み、SEOのポイントを解析します。 以上のエンハンスメントを活用することで、より高速でユーザーフレンドリーなサイトを構築できます。 ユーザーフレンドリーなライブラリの紹介 Next.js 13は、デフォルトでReactをベースに構築されていますが、よりユーザーフレンドリーなライブラリを使用することで、開発時間の短縮、開発効率の向上が見込めます。 以下に、いくつかのライブラリを紹介します。 SWR データのFetchやキャッシュの制御を簡素化してくれるライブラリです。リアルタイムでキャッシュの内容を更新することで、パフォーマンスを改善します。 React Query Reactアプリケーションでよく使用されるライブラリで、APIリクエストを管理するためのいくつかの問題を解決してくれます。キャッシング、再試行、オンライン/オフライン変換、並列リクエスト、アップロードなどの機能を提供しています。 Framer Motion アニメーション用のライブラリで、ユーザビリティの向上、より美しいアニメーションのインパクトを与えるために利用することができます。
まとめ Next.js 13では、新しい機能と最適な開発プラクティスが多く導入されました。上記の内容を理解し、利用することで、より優れたパフォーマンスのサイトを開発することができます。是非チャレンジしてみてください。
サンプルプロジェクトの紹介: では、ここで実際のプロジェクトを紹介します。このプロジェクトはNext.js 13を使って作成されていて、ローカル開発環境からプロダクション環境へのデプロイまで一連のステップを模範的に実践しています。 ローカル開発環境の構築には、お気に入りのエディターとターミナルを使用して、プロジェクトをクローンしてnpm installを実行し、開発サーバーを起動するだけです!
開発サーバーはHMR(ホットモジュールリプレースメント)をサポートしており、開発を快適に行うことができます。 コンポーネントの実装方法は、Next.jsのパワフルな機能を最大限に活用しています。たとえば、自動的に生成されたページルーティングを使用して、必要なページコンポーネントを追加するだけでページを作成することができます。
また、APIルートを使用して独自のAPIエンドポイントを作成することもできます。さらに、ビルトインCSSサポートにより、CSSモジュールまたはCSS-in-JSを使用してスタイリングを完了することができます。 プロダクション環境へのデプロイには、Vercelによるデプロイメントを使用しています。
Vercelには、GitHubやBitbucketなどのバージョン管理システムと簡単に統合できる他、プラットフォームに特化した最適化が実装されています。たとえば、自動的に生成されたPWAマニフェストやnext/imageコンポーネントなどがあります。また、デプロイ時に自動的に生成されるファイルごとにCDNを使用して最適化された静的アセット最適化もあります。
このプロジェクトの完全なコードは、GitHubリポジトリで公開されています。ぜひチェックしてみてください! 以上が、Next.js 13における最適なプラクティスとユーザーフレンドリーなライブラリの紹介のサンプルプロジェクトの実装方法です。
Next.js 13は、Web開発をより簡単かつパワフルにします。 最適なプラクティスを使用することで、静的アセットやキャッシュの最適化、サーバーサイドレンダリングを行うことができます。
さらに、SWR、React Query、Framer Motionなどのユーザーフレンドリーなライブラリがあります。 ビルド時間の最適化、ユーザー体験の最適化、SEOの最適化にも注力しました。 最後に、ローカル開発環境の構築、コンポーネントの実装方法、プロダクション環境へのデプロイ方法を紹介するサンプルプロジェクトがあります。
全体的に、Next.js 13は、Web開発をより効率的かつスムーズにします。