おはこんばんちわ!ギルガメです!
- プレイヤーをギルガメに変更
- 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を使用している皆さん、さあ無料アセットの紹介を始めましょう。無料アセットとは、ユーザーが無料で利用できる、3Dモデルやエフェクト、シェーダー、画像、音楽などのリソース素材のことです。 複数あるUnity3Dのアセットの中でも、無料アセットは重要です。なぜなら、Unity Asset Storeには数多くの有料アセットがあり、高品質なものが多い反面、予算が限られていたり、個人プロジェクトの場合はコスト削減が求められることもあるからです。無料アセットは、限られた予算でも高品質なゲームを制作するための助けとなります。 無料アセットの選び方ですが、品質と著作権の両方を考慮して選ぶことが重要です。配布条件を確認することも必要であり、適切なクレジットを表示することを忘れずに。 以上が、無料アセットについての簡単な紹介でした。それでは、次の章でUnity3Dで有用な無料アセットの種類を見ていきましょう!
はじめに言いましょう。Unity3Dには、たくさんの無料アセットがあります。しかし、どれを使うべきか悩んでしまうかもしれません。この記事では、Unity3Dで有用な無料アセットを紹介します。 3Dキャラクターモデル ゲームに欠かせないのが、キャラクターです。しかし、キャラクターモデルを作るのは大変です。そこで、無料アセットを使いましょう。初心者でも扱いやすいモデルがたくさんあります。大量のポリゴン数で重くなる心配もありません。 アニメーション素材 キャラクターモデルを作ったら、アニメーションをつけましょう。しかし、アニメーションは作り込まないと、生き生きとした動きになりません。そこで、無料アセットのアニメーション素材を使うのがおすすめです。細かい動きまで作り込まれていて見栄えが良く、なおかつ無料で手に入れられます。 3Dモデル ゲームには、キャラクター以外にも背景やオブジェクトが必要です。しかし、すべて自分で作るのは大変です。そこで、無料アセットの3Dモデルを使いましょう。建物や椅子、草木など様々なものが揃っています。これを使えば、オリジナルの世界観を簡単に作り出すことができます。 プリセットシェーダー シェーダーを作るのは非常に難しいです。しかし、シェーダーがないとリアルな表現ができません。そこで、無料アセットのプリセットシェーダーを使うのがおすすめです。無料で配布されているシェーダーでも、きれいな表現ができるものがあります。 フリーのUI素材 ゲームには、UIが欠かせません。しかし、UIをデザインするのは専門的な技術が必要です。そこで、無料アセットのUI素材を使うのがおすすめです。ボタンやテキストなど、いろいろなUI素材が揃っています。デザインにこだわった素材が多く、簡単にオシャレなUIを作成できます。 音楽・効果音素材 ゲームには、BGMや効果音が欠かせません。しかし、どんな音楽を作るか、どのような音を鳴らすかを決めるのは難しいです。そこで、無料アセットの音楽・効果音素材を使うのがおすすめです。豊富な種類の素材があり、ゲームの世界観にあった音が簡単に手に入ります。 その他 上記以外にも、無料アセットには魅力的なものがたくさんあります。例えば、パーティクルエフェクトや天候変化、カメラの制御など、開発者の役に立つものが数多くあります。自分の作りたいものにあったアセットを探してみましょう。 以上が、Unity3Dで使える無料アセットの種類です。無料で使えるものがあると知れば、開発者の荷物が少し軽くなったような気がします。ぜひ、探してみて下さい!
はい、無料アセットは費用をかけずに素晴らしいリソースを手に入れることができますが、使う前に注意が必要です。まず、配布条件をしっかり確認しましょう。中には商用利用ができないものや、再配布が禁止されているものもあります。そのため、ライセンスに従わない使用は法的トラブルになる可能性があるため、確認は必須です。 また、著作権についても理解しておきましょう。無料であっても、著作権があるものはあります。そのため、作者に許可を取らずに自分の作品に使用するのは違法行為になります。 さらに、無料アセットには限界もあります。完璧なアセットを求めるのであれば、有料のものを選ぶべきです。また、無料アセットは使用者が少ない場合があるため、サポートが不十分であったり、バグが発生した場合に問題が解決されなかったりすることもあります。 ですが、こういったことを理解した上で無料アセットをうまく活用することができると、クオリティの高い作品を手軽に制作することができるでしょう。
はい、無料アセットを使う際に役立つおすすめアセットを紹介します!まずは「リアルな水描画エフェクト」。誰もが海や川に思いを馳せることがあるでしょう。このアセットを使えば、クオリティの高い水の表現ができるため、自然な水の描画に使えます。次に、「ポリゴン数が少なく軽量な3Dリギング用ボーン」。3Dモデリングの際にポリゴン数が多いと重くなってしまいますが、このアセットを使うことで軽量なモデルを作成できます。このため、スマートフォンなどのモバイルデバイスやプレイヤーの負担を減らすために最適です。 次に、「天候や季節に合わせた美しい背景テクスチャ」は、汎用性の高い背景テクスチャが欲しい方に格好のアセットです。自然な光や影を描画することができ、背景が現実的に見えます。初心者でも簡単に使える「3Dキャラクターモデル」は、初めてゲームを開発する方にお勧めです。リアルなモデルは、自分でデザインするのは大変な作業ですが、このアセットを使うことで、簡単に高品質なキャラクターを作成することができます。 そして、「リアルタイムに草や木々を描画するアセット」は、自然な風景を描画するためのアセットです。特に、オープンワールドゲームを開発している方にはお勧めです。また、「3D鉄道パズルゲーム用のアセットパック」は、鉄道愛好家にとっては夢のアセットです!このパックを使えば、鉄道のモデリングが簡単になります。 さらに、「Unity3DでオシャレなUIを簡単に作成できるフリーのアセット集」は、UIに自信がない方でも簡単に美しいUIを作成することができるアセットです。最後に、「車両の運転感を自然なものに加工するためのアセット」は、シミュレーションゲーム開発者にお勧めです。このアセットを使えば、リアルな運転体験を再現することができます。 これらのおすすめアセットを利用することで、ゲーム開発がよりクオリティの高いものになると思います。何を使うか迷った際は、ぜひこの記事を参考にしてみてください!
有料アセットとの比較 無料アセットは素晴らしいものですが、いくつかの限界もあります。有料アセットを利用すると品質の高いものを手に入れることができます。一方で、高い値段のため有料アセットを利用できない人も少なくありません。利用を決める前に、有料アセットの利点とデメリットを確認しましょう。 有料アセットの欠点は、価格が高いことです。また、戻りがない場合があり、予算の見積もりが難しいこともあります。しかし、有料アセットを利用すると、専門家によるサポートを受けられるため、開発プロセスがスムーズに進行する可能性が高くなります。 無料アセットと有料アセットの使い分けが重要です。有料アセットは、時間と予算に余裕がある場合に使うことをおすすめします。また、必要な場合は、有料アセットの代わりに無料アセットを利用しても構いません。利用目的や予算、開発スケジュールに応じて、自分に合ったアセットを選びましょう。
Unity3Dに欠かせない無料アセットは、ゲーム制作に大きな助けとなります。無料で手に入る素晴らしい道具たちを使いこなし、より優れたゲームを作り上げましょう!有料アセットも良いですが、無料アセットがあればそれだけで十分に素晴らしいゲームを作り上げることができます。無料アセットはまさに、ゲーム制作における最高の友達です!
おはこんばんにちは!ギルガメです!
久しぶりにブログを更新します。
ユグドラシルプロジェクトは「Colyseus」でリアルタイム通信のサーバーをAWSのEC2で構築してワールドマップのような世界を実現していました。
ですがいくつか問題があったのでFishnetを使ったリアルタイム通信にリニューアルしたいと思います。
「Colyseus」で問題があった例です。この時はまだバージョンも古かったので今は下記の問題はないかもしれません。
今回は初めてホラーゲームの開発をしてみて、ギルガメ的に役にたったものをまとめていきたいと思います。
これさえできたらホラーゲームのベースになるものになるので、スムーズに開発が進みます。まだ時間短縮にもなるので、ぜひ試してみてください!
まずホラーゲームの舞台にステージを作っていきます。こちらはデザインをお持ちの方は別で作成してもいいですが、ギルガメはUnity Packageから無料で使えるProbuilderを使って開発します。
まずはProBuilderをUnity Packageからインポートします。
おはこんばんにちは!ギルガメです!
前回はサーバーサイドについてお話しましたが、今回はギルガメが開発に使った「Colyseus」について詳しく説明したいと思います。Colyseusのオフィシャルサイトは英語なので、わからないとこもあると思いますが、頑張ります。
ギルガメのリアルタイム通信のテストの動画になります。
まず簡単にColyseusとは何なのか
Colyseusは、Node.js用の信頼できるマルチプレイヤーゲームサーバーです。ネットワーキングを気にする代わりに、ゲームプレイに集中することができます。
このフレームワークの使命は、JavaScriptで独自のマルチプレイヤーゲームを作成するための最も簡単なソリューションになることです。
Colyseusが提供するものについてです。