【TGS】ポートフォリオ作品

奥田 安之里(2022年卒)

・学科    : CG・ゲームデザイン学科
・コース   : ゲームデザインコース
・希望職種  : プログラマー・プランナー
・使用ソフト : Unity, UnrealEngine4, Clip Studio Paint Pro

Unityを中心としたプログラムを学んでおります。
ゲーム制作では、レベルデザイン(ステージ作りや敵の配置)や、
2Dならイラスト制作に力を入れております。

他にも、趣味で2Dのイラストの制作もしており、そちらの方は
https://pando.life/odc/article/79332 をご覧下さい。

イラスト作品

奥田 安之里
大阪デザイナー・アカデミー


下記のバナーをクリックすると、vivivitに移動します。






これまでのゲーム作品をまとめた動画です。
注:動画の内容は、古いバージョンのゲームが使用されています。



・魔法使いの脱出
使用ソフト : Unity 2019.4.22f1, Clip Studio Paint Pro
制作期間  : version1・1週間, version2・約2ヶ月
制作人数  : 1人
制作パート : プログラム, 背景やキャラクターのデザイン, レベルデザイン

Unityroomの1週間でゲームを作るイベントのお題「あける」で制作したゲームです。
公開したゲームの中で、最初に一般公開したゲームです。
評価を受けた後、ステージ2,3を追加で作成しました。
下のバナーをクリックして、ゲームプレイ!



・刻ノ者
使用ソフト : Unity 2019.4.22f1,  Clip Studio Paint Pro
制作期間  : 約1年
制作人数  : 1人
制作パート : プログラム, 背景やキャラクターなどのデザイン, レベルデザイン


卒業制作のゲームです。
プログラム以外にも、キャラクターやストーリーの制作にも力を入れました。
他にも、ステージごとにサブ目標みたいなものを設定し、最高評価を取るとギャラリーが
更新されるという、やりこみ要素も制作しています。

下のバナーをクリックして、ゲームプレイ
ソースコード
プレイヤーを動かすスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//プレイヤーの動作
public class PlayerMove : PlayerBase
{
//方向
[HideInInspector]
public Vector2 axis;
//速度
[Header("標準:18")]
public float speed = 10;
[Header("標準:2800")]
public float jumpPower;
//移動の限界値
public float rightAxis = 1.0f, leftAxis = -1.0f;

public bool
rightMove = true, //右に動けるか
leftMove = true, //左に動けるか
jump = false, //空中状態
right = true, //向いている方向
anim_trigger = true; //アニメーション

//地面、左右の衝突判定
[SerializeField]
BoxCollider2D groundCollider, rightCollider, leftCollider;
//エフェクト
[SerializeField]
ParticleSystem jumpEffect, landingEffect, hold_1_Effect, hold_2_Effect;
//音
[SerializeField]
PlayerSound sound;
//攻撃力
[SerializeField]
PlayerAttackPower attackPower;

bool attackHold;
float holdTime;
int setPower;

void Update()
{
if (GameSetting.AllTriger && PlayMode && !DamageMode)
{
//移動
if (MoveTrigger)
{
//左右の衝突判定の処理
if (Input.GetButtonDown("Horizontal"))
{
rightCollider.enabled = true;
leftCollider.enabled = true;
}
if (Input.GetButtonUp("Horizontal"))
{
rightMove = true;
leftMove = true;
}
//十字キーを押すと動く
axis.x = Input.GetAxisRaw("Horizontal");
//動けるかどうか読み込む
if (!rightMove) axis.x = Mathf.Min(axis.x, 0);
if (!leftMove) axis.x = Mathf.Max(axis.x, 0);
axis.x = Mathf.Clamp(axis.x, leftAxis, rightAxis);
transform.Translate(speed * Time.deltaTime * axis);

//ジャンプ
if (Input.GetButtonDown("Jump") && !jump) JumpMotion(true);
}

//攻撃の溜め開始
if (Input.GetButtonDown("Attack") && AttackTrigger && !GameSetting.PlayerTalkTrigger && !attackHold)
{
MoveTrigger = false;
PowerTrigger = false;
AttackTrigger = false;
ChangeTrigger = false;
anim.SetTrigger("Hold");
attackHold = true;
}
//攻撃
if(Input.GetButtonUp("Attack") && !GameSetting.PlayerTalkTrigger && attackHold)
{
setPower = 1;
if (holdTime > 2.5f)
setPower = 2;
else if (holdTime > 1.0f)
setPower = 3;
attackPower.PowerUp(setPower);
anim.SetTrigger("Attack");
}
if (attackHold && holdTime < 3)
{
holdTime += Time.deltaTime;
if (holdTime > 2.0f && !hold_2_Effect.gameObject.activeSelf)
hold_2_Effect.gameObject.SetActive(true);
else if (holdTime > 0.8f && !hold_1_Effect.gameObject.activeSelf)
hold_1_Effect.gameObject.SetActive(true);
}
#region OldAttack
//連続攻撃(旧型)
//if (Input.GetButton("Attack") && AttackTrigger && !GameSetting.PlayerTalkTrigger)
//{
// //1回目
// if (!attackMode)
// {
// attackMode = true;
// anim.SetTrigger("Attack");
// cameraZoom.Priority = 15;
// MoveTrigger = false;
// PowerTrigger = false;
// ChangeTrigger = false;
// continuousAttackTrigger = false;
// }
// ////2回目以降
// //else if (attackMode && continuousAttackTrigger)
// //{
// // anim.SetTrigger("ContinuousAttack");
// // continuousAttackTrigger = false;
// //}
//}
#endregion
}

//移動できない状態なら、力を0にする
else axis.x = 0;

if (anim_trigger)
{
//右を向く
if (axis.x > 0)
{
if (!right) RightLook();
anim.SetBool("Move", true);
}
//左を向く
if (axis.x < 0)
{
if (right) LeftLook();
anim.SetBool("Move", true);
}
//止まる
if (axis.x == 0)
{
anim.SetBool("Move", false);
}
}
}

//アニメーションから呼び出す
public void HoldStop()
{
attackHold = false;
hold_1_Effect.Stop();
hold_2_Effect.Stop();
}

//攻撃から動ける状態にする
public void AttackEnd()
{
MoveTrigger = true;
AttackTrigger = true;
PowerTrigger = true;
ChangeTrigger = true;
holdTime = 0;
hold_1_Effect.gameObject.SetActive(false);
hold_2_Effect.gameObject.SetActive(false);
attackPower.PowerReturn();
}

//ジャンプモーション
public void JumpMotion(bool jumping)
{
groundCollider.enabled = true;
jump = true;
anim.SetBool("Jump", true);

if (jumping)
{
Instantiate(jumpEffect, groundCollider.transform.position, Quaternion.identity);
sound.PlaySound(PlayerSound.SoundsType.ジャンプ);
rb.velocity = Vector2.zero;
rb.AddForce(transform.up * jumpPower, ForceMode2D.Impulse);
}
}

//着地
public void Landing()
{
if (jump) Instantiate(landingEffect, groundCollider.transform.position, Quaternion.identity);
jump = false;
anim.SetBool("Jump", false);
}

//右を向く
public void RightLook()
{
anim.SetTrigger("Right");
anim.SetBool("RightBool", true);
right = true;
}
//左を向く
public void LeftLook()
{
anim.SetTrigger("Left");
anim.SetBool("RightBool", false);
right = false;
}

public void MPSet()
{
power_mp.MPStartSet();
}
}




下のバナーをクリックして、ゲームプレイ!

ソースコード
箱を動かすスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

//Playerが箱を動かす処理
public class BoxMove : MonoBehaviour
{
//プレイヤーを取得
[SerializeField]
PlayerMove player;
///箱を動かせる状態か
public bool boxMoveTrigger = false;
//動かす箱を取得
[HideInInspector]
public GameObject box;
//動かす方向
int moveX = 0, moveZ = 0;
//矢印, 箱を取得するコライダー
public GameObject arrow;
//暗転
[SerializeField]
Image black;
//地面判定
[SerializeField]
GroundCheckExit groundExit;

//1つ前に戻る際使用するデータ
///動かす前の箱とプレイヤーの座標を保存
Vector3[] playerPos = new Vector3[200], boxPos = new Vector3[200];
GameObject[] beforeMoveBox = new GameObject[200];
//クリアの球体を取得
[SerializeField]
ClearObject[] clearObject;
//戻る回数
int beforeMoveCount;
//落下前の位置を示すマーカー
public GameObject beforeFallPos;
//落下前の位置に戻る条件
[HideInInspector]
public bool beforeFallTrigger = false;

static public int moveingBox;

private void Start()
{
moveingBox = 0;
beforeMoveCount = 0;
}

void Update()
{
//メニューを開いていなければ
if (!player.menuMode)
{
//箱を認識し、地面にいる、動ける状態
if (boxMoveTrigger && player.ground && player.moveTrigger)
{
if (Input.GetButtonDown("Push"))
{
moveingBox++;
//箱を動かす声を出す
player.voice.Voice(CharacterVoice.ActionVoice.BoxMove);
BeforePositionSave();
box.GetComponent<BoxTransform>().Move(moveX, moveZ);
beforeFallTrigger = false;
beforeFallPos.SetActive(false);
}
}
///プレイヤーが動ける状態かつ、マーカーがある場合、落下前の位置にする
if (Input.GetButton("FallRetry") && player.moveTrigger && beforeFallTrigger)
{
//マーカーを表示
if (!beforeFallPos.activeSelf)
{
beforeFallPos.SetActive(true);
}
if (Input.GetButtonDown("Return"))
{
//落下前の位置の更新を止める
groundExit.beforeBool = false;
//暗転
black.color = new Color(0, 0, 0, 0.2f);
//フェードイン
black.DOFade(0, 0.2f).OnComplete(BeforeMoveFinish);
//プレイヤーの位置を落下前の位置に戻す
transform.position = new Vector3(
beforeFallPos.transform.position.x,
beforeFallPos.transform.position.y + 0.7f,
beforeFallPos.transform.position.z);
//戻るトリガーをオフにする
beforeFallTrigger = false;
//マーカーを非表示
beforeFallPos.SetActive(false);
}
}
///シフトキーが押されていない状態のスペースキーで1つ前に戻る動作を呼ぶ
else if (Input.GetButtonDown("Return") && beforeMoveCount > 0 && moveingBox == 0)
{
BeforeMove();
}
///シフトキーが離されたらマーカーを非表示
if (Input.GetButtonUp("FallRetry"))
{
beforeFallPos.SetActive(false);
}
}
}
///箱の移動先
public void TakeDestination(int x, int z)
{
moveX = x;
moveZ = z;
}
///箱の取得、矢印の移動
public void GetBox(GameObject getBox)
{
box = getBox;
arrow.transform.position = getBox.transform.position;
arrow.SetActive(true);
}
///動かす前を保存
void BeforePositionSave()
{
//次の保存場所へ
if (beforeMoveCount <= playerPos.Length-2)
{
beforeMoveCount++;
}
///保存場所がいっぱいになったら上書き
else if(beforeMoveCount > playerPos.Length-2)
{
///現在の動作を1回前の動作に上書き
///[0]は呼ばれず、[-1]にならないように、ごみ箱としての役割を果たす
for(int i = 2; i < playerPos.Length; i++)
{
playerPos[i-1] = playerPos[i];
boxPos[i-1] = boxPos[i];
beforeMoveBox[i-1] = beforeMoveBox[i];
}
}
///保存
playerPos[beforeMoveCount] = transform.position;
boxPos[beforeMoveCount] = box.transform.position;
beforeMoveBox[beforeMoveCount] = box;
}
///1手戻る
///プレイヤー、箱の座標を戻す
void BeforeMove()
{
player.moveTrigger = false;
//落下前の位置に戻るトリガーをオフにする
beforeFallTrigger = false;
//暗転
black.color = new Color(0, 0, 0, 0.2f);
//矢印を非表示
arrow.SetActive(false);
//全ての箱やプレイヤーの動作を止める
DOTween.KillAll();
//クリアオブジェクトの動作を再稼働
for (int i = 0; i < clearObject.Length; i++)
{
clearObject[i].Restart();
}
///プレイヤー、箱、矢印の場所を戻す
arrow.transform.position = boxPos[beforeMoveCount];
transform.position = playerPos[beforeMoveCount];
transform.LookAt(beforeMoveBox[beforeMoveCount].transform.position);
transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, 0);
beforeMoveBox[beforeMoveCount].transform.position = boxPos[beforeMoveCount];
beforeMoveBox[beforeMoveCount].layer = 9;
box = beforeMoveBox[beforeMoveCount];
//一手戻る
beforeMoveCount--;
//フェードイン
black.DOFade(0, 0.2f).OnComplete(BeforeFinish);
}
///一手戻り終わったら
void BeforeFinish()
{
//矢印を再配置
arrow.SetActive(true);
Invoke("PlayerMoveTrue", 0.2f);
}
void PlayerMoveTrue()
{
//プレイヤーを行動可能状態にする
player.moveTrigger = true;
}
///落下前の位置に戻ったら、更新を開始
void BeforeMoveFinish()
{
groundExit.beforeBool = true;
}
}




下のバナーをクリックして、ゲームプレイ!





GAME
2件