アフィリエイト広告を利用しています

現在ははてなブログで投稿しています!

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2017年08月28日

【unity5 三項演算子の使い方】ifから少し使いやすく?三項演算子の使い方

三項演算子って知ってますか?
使えるととても便利です。


僕の場合、「三項演算子の使い方」は
知っているんですが、
「三項演算子とは何か」を聞かれると
うーん…となってしまいます(笑)


数学とかで習いますかね…?

まぁ、それは置いといて。


三項演算子はどんな場合に使えるのか?
というと、三項演算子とは、if構文での
制御を一行にまとめたようなものです。


「条件」
「条件が成り立つ時の返り値」
「条件が成り立たない時の返り値」

これらが一行に詰まっています。


では、「返り値とは何か」を
説明します。


返り値とは、その名の通りで、
「返す値」ですね。

「関数が実行された」
「じゃあこれを返して代入しよう」

みたいな?


やっていった方が理解は
早いと思うのでやってみましょう!





三項演算子の使い方

まず、どの様に記述すれば良いのか
を見ていきましょう。
return 条件 ? 条件が成り立つ時に返す値 : 条件が成り立たない時に返す値;

この様に、「?」や「:」で区切ります。


この一文は、「条件」によって変わる
値を返すことが目的です。


その為「return」が文頭に付いていますね。


何に値を返すのか?
それは三項演算子の使い方にも寄ります。


例文と一緒に見ていきましょう。
//変数
//↓生きているかの判定に使いたい

bool isAlive;

//使う体力
//予め100を代入しておく

int life = 100;

void Update () {
 isAlive = IsAlive();
}

public bool IsAlive () {
 return life > 0 ? true : false;
}

以上が例文となります。

見て分かる人は開発の再開、
見て分からない人は解説へゴー↓です。


解説


まず、変数二つですね。

これはコメント化もしてある為
比較的分かりやすいかと思われます。


isAlive
型はbool型です。
生きていれば「true」が、
死んでいれば「false」が入るように
していきたいと思います。

life
その名の通り、「体力」です。
int型です。
floatでも良かったんですが、
intの方が扱いやすいのでintにしました。
この変数には予め100が入れてあります。
体力が100スタート、という事ですね。




次はUpdate関数です。

isAlive = IsAlive();
こうありますね。


言葉に直すとしたら、

「isAliveには、IsAlive関数を代入」

くらいの意味でしょうか?


意味わかりませんね。

変数に、しかもbool型に関数を
代入するなんて。


それは一度置いておいて、
IsAlive関数を見に行きましょう。
public bool IsAlive () {
 return life > 0 ? true : false;
}


ここに三項演算子が使われています。


まず、「return」ですね。
値を返す」という意味です。


どこに返すのか?
そこで、さっきの一文が出てきます!

「isAlive = IsAlive()」←ここです!

ここに返ってきます。


それでまとめると、
「isAliveにはIsAlive関数の結果を代入する
  ↓
 IsAlive()が分からないと代入出来ない
  ↓
 関数の実行をしに行く
  ↓
 関数内で『life』により、返す値を
 trueとfalse間で変更
  ↓
 returnで返す
  ↓
 isAlive = IsAlive()に
 値が返ってくる
  ↓
 返ってきた値を『isAlive』変数に代入」


以上が一連の流れになります!


これで分かりますでしょうか?
相変わらず説明がゴミなので
理解出来ない方もいっしゃるかと……。


その時はごめんなさい…!
精進します。


それでは、また。ノシ


スポンサードリンク







2017年08月25日

【unity5 解説あり】子オブジェクトの個数を取得するには?

ゲームを作っていて、
子オブジェクトの数の取得の仕方が
分からなかったので、
復習も兼ねてメモっておきます。



取得する方法
int _ChildCount = this.transform.childCount;

これでこのオブジェクトの
子オブジェクトの数が取得出来ます。

例文
GameObject objA;

void Start () {
 //objAの子オブジェクトの数を取得する
 int _ChildCount = objA.transform.childCount;

 //objAの子オブジェクトの数をコンソールに出力
 print(_ChildCount);
}

解説

上の例文を解説します。
といっても、簡単にですが。


全体的に見ると、
objAはGameObject型の変数です。
そのため、関数の外側に記述してあります。


Start関数に入りますが、
また変数宣言です。


「_ChildCount」という名の
int型の変数を用意しています。


この変数は常にいる訳では無いので
(他の関数でも使いたい、などは
  少し工夫が要りますが)
この場しのぎの変数です。


transform.childCount で
子オブジェクトの数が取得できるので

objA.transform.childCount

でobjAの子オブジェクトの数を取得、
さっき作った _ChildCount に入れます。


後は _ChildCount を
プリント(デバッグと似たようなもの?)
すれば、コンソールに表示されます。


終わりに

たまにこういう事をメモっていきます。

分からない事があれば覗いてみて下さい!
何かあるかもです。


では、また次回。ノシ


スポンサードリンク







2017年08月08日

【スプラトゥーン2】やってみました!

いま話題の「スプラトゥーン2」を
やってみました。


top_visual.png


というか、wiiUの
「スプラトゥーン」すら
まともにやった事無いんですけどね(笑)

今日が初めてです!


初めて使った武器は
「スプラマニューバー」?
でしたっけ。

あの二丁のやつです。


個人的には、回避があるので
使い易かったですね。


初めてスプラトゥーン2を
やって、3, 4 キルくらいだったと思います。

初めてにしては結構
倒せた方ではないかと……。


回避で「バヒュッ」とやって
「バババ!」「バンッ!」みたいな。


766aa511fe306649db94d5ff80b74a5e.png

楽しかったです…。


ただ、友達にやらせて貰った
だけなので家には無いんですよねー…。


買いたいですがお金がありません!
欲しいです!


お金が溜まったら買おうかな…。


では、今回はこれだけです!(笑)

では、皆さんも機会があれば
やってみて下さいね!



スポンサードリンク








2017年08月06日

【unity5】スクリプトからオブジェクトを動かす

オブジェクトを移動させるのは、
そんなに難しい処理を必要としません。


が!プレイヤーの移動とかになると
あまり使われなかったりします。


プレイヤーの移動には、
CharacterController」や
(↑キャラクターコントローラー)
Rigidbodyに速度を加える
が良く使われると思います。

特にキャラクターコントローラーですかね?
良く使われるのは。


まぁ、僕はRigidbodyの方を使うんですが(笑)


っと、話が逸れましたね。
戻しましょう。


それで、この「位置を動かして移動」と
いうのは……よく考えると、あまり
使い道が無いような……?


ですがまぁ、知っておいて
損は無いと思います!


スポンサードリンク




this.transform.position

まずはゲームオブジェクトの位置の取得から
やっていきましょうか。


これが分からないと何も出来ません。
足したり、引いたりとかね。

だって

「何に足すのか、何から引けば良いのか」

が分からないですからね。


ゲームオブジェクトの位置の取得は
二種類の方法があります。

……といっても、
たどる道が違うだけなんですがね!


1.
//ゲームオブジェクトとして変数を宣言
GameObject obj;

void Start () {
 //obj.transform.positionでobjの位置が取得出来る
 Debug.Log(obj.transform.position);


2.
//Transformとして変数を宣言
Transform objTrans;

void Start () {
 //objTrans.positionでobjの位置が取得出来る
 //もう既にTransformだから
 Debug.Log(objTrans.position);


この2つの方法で、位置が取得出来ます。


僕がよく使うのは、
一番目の方ですかね。


なんか楽ですし。


実際に動かしてみる

無駄な部分ははぶきますね。

//ゲームオブジェクトとして変数を宣言
GameObject obj;

void Update () {
 //objの位置を変える
 obj.transform.position.x += 1;


これだと、
objのx軸に1ずつ足していく
という処理になります。


言葉で表すと、
「高速で右に移動していく」
ですかね。


なぜ高速かというと、
Update関数に書いてあるので…。


取り敢えず、こんな感じで動かせます。


また気が向けばもう少し
難しい処理で動かしてみましょうかね…?

では、また!



スポンサードリンク








2017年08月05日

【unity5】スマホゲーム「艦隊これくしょん」をunityで3Dアクションにしてみる

You Tubeで動画を公開しました!


スマホゲームで「艦隊これくしょん」っていうゲームありますよね?


通称「艦これ」ですが、今回はそのゲームを、
unity5を使って3Dアクションゲームにしてみます!


少しずつ作っていくので完成はいつになるんでしょう?


まぁ、気ままにやっていきますので。

気が向いたら見ていって下さいね。

スポンサードリンク




移動(とエフェクトをテキトーに)実装




エフェクト修正版





スポンサードリンク








2017年08月04日

【unity5】Vector3.Distance()で2点間の距離を測る : 解説あり

unityでゲーム作ってる時、

「ここからここまでの距離が知りたい」

とかありますよね?


プレイヤーに一番近いアイテムを拾ったり、
目的地までの距離を測ったりと、色々な事に使えます。


一見、難しそうですが超簡単です。


それでは、やっていきましょう。


スポンサードリンク





Vector3.Distance()の使い方

Vector3.Distance(Vector3 a, Vector3 b);


これだけです(笑)。


a, b にはTramsform.positionが入ります。
まぁ位置ですね。


これだけで使えます!


解説

まず使用例を挙げますと、
using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {

 public Transform other;

 void Start () {
  float _distance = Vector3.Distance(other.position, transform.position);
  print(_dinstance);
 }
}

こんなのがあります。


クラスの中を解説しますが、
「other」という変数を宣言しています。

型は「Transform」です。
Transformは「位置・回転・大きさ」のプロパティを扱います。

今回はそのTransformの中の「位置」を使います。


Start関数に移ります。

float _distance で変数を宣言していますが、
型は「float」です。


距離は、少数で取得されるためです。
a, b 間の距離を少数で取得する、という事ですね。


そして、「otherの位置」と「ここ(ゲームオブジェクト自身)の位置」の間の
距離を算出して「_distance」に入れています。


最後の「Print(_distance);」ですが、
これは、コンソールに取得した距離を表示させているだけですので、
まぁそんなに気にしなくても良いかと。




ではでは、これで終わりです。

※この記事のサンプルはUnity - スクリプトリファレンスの改良版を公開しています。



スポンサードリンク








2017年08月02日

プレイヤーを動かす:関数の解説

なんか記事を分けるのが
面倒くさかったので関数はまとめて書きます。


やっぱ、一気に解説した方がいいのかな…?


というか、更新遅れてごめんなさい!
色々ありまして!はい、すみません!!

記事書いて、保存しようとしたら
ネットエラーが出て……。

結局保存されておらず
同じ部分を何回も書かされました……。

正直、めっちゃイラッときました!
今度からはネットが安定してる所で書こう…。
(やる気が一気に無くなります…)


……関数は、Start、FixedUpdate、Updateがあります。
順番に見ていきましょう。





Start関数


まず、Start関数はこれです!
void Start () {
 rb = this.gameObject.GetComponent<Rigidbody>();
 anim = this.gameObject.GetComponent<Animator>();
}

これはまぁ、Rigidbodyと
アニメーター(Animator)を取得して
使えるようにしてるだけなんですがね(笑)

GetComponent<取得したいコンポーネント>()

で「コンポーネント」が取得出来ます。


……コンポーネントについては、
またいつか ^_^;

近い内に記事を書きますね。
今のところはスルーでお願いします……
ごめんなさい m(_ _)m

2017/9/8 追記
コンポーネントについての記事を更新しました。
↓こちらからご覧下さい。

コンポーネントとは?


結果、「rb」には「Rigidbody」、
「anim」には「Animator」が
入っている事になるので
スクリプト内ではrbやanimと記述すれば
それぞれ Rigidbody 、 Animator が使えます。


FixedUpdate関数

void FixedUpdate () {
 //*****接地判定*****//
 if (Physics.SphereCast(this.gameObject.transform.position + new Vector3(0, 2f, 0), transform.lossyScale.x * 0.5f, Vector3.down, out hit, 2f)) {
  isGrounded = true;
 } else {
  isGrounded = false;
 }
 //*****************//
}



……なんか一行だけ
やたらと長いですが……。


まぁ、やってる事は
意外と簡単?かもしれません。




では、気を取り直して。


まず、FixedUpdateとは
何か、を説明していきましょうか。



FixedUpdateとは、
Updateよりも狭い間隔で呼ばれる関数
です。


どういう事かというと、
Updateよりも呼ばれる間隔が狭い…つまり、
Updateよりも先に呼ばれるという事ですね。


例を出すと、
Updateは一秒に一回呼ばれるとしましょう。
そうすると、FixedUpdateは0.5秒毎に
呼ばれる、みたいな感覚でしょうか。


もっと簡単に言えば、

FixedUpdate → Update

の順に更新され続ける!

と覚えて下さい(笑)


多分これで大体は合ってるかと…


話を戻しましょう。

それで、コメント化もしてありますが
FixedUpdateでは接地判定をしています。


大まかな流れとしては、
地面にキャラクターが着いているか
 h            h
 hはい         hいいえ
 ↓             ↓
isGround変数を   isGround変数を
 trueにする       falseにする

         ↓

  スクリプト内で「isGround」を使えば
    接地しているかどうかが扱える

こんな感じです。


この流れを、
FixedUpdateで処理しています。


if構文の使い方、
覚えていますか?


簡単に説明しますね。
if (条件) {
 ・・・条件が成り立つ時の処理・・・
} else {
 ・・・条件が成り立たない時の処理・・・
}


まぁ、これくらいは覚えていますよね!
……いますよね?


もし、「覚えていない!」という方は
こちらが制御構文の記事になります。

ご覧下さい。


それで、()の中が条件ですね。
その条件が一番がややこしいですが…。


まず、()内でやっている事を
軽く説明します。


使っているのは、
Physics.SphereCast()
というものです。


どういうものかと言うと、
仮想の球を飛ばしてその球が
  何かに当たるかどうか

を判定するものです。


指定した位置から、指定した方向に
向けて、指定した長さの分だけ
「仮想の球」を飛ばします。


飛ばすと言っても、
「バヒュッ」って感じでは
無くてですねー…

飛ばすというか、
伸ばすというか……。


………適当な語句が僕の
ボキャブラリーには無いので
動画のリンクを貼ります……。
そこでイメージを掴んで下さい…。



何か話がずれました、
Physics.SphereCast()は
仮想の球を飛ばすと言いましたが、
物理的な影響は一切ありません!

あくまでも「仮想」ですので、
判定のみに使う事が出来ます。


それをプレイヤーの位置から
下向きに飛ばしていき、
何かに着いたら「地面に着いている」と
判定する様にします。

無題2.png

ただ、普通に光線(Ray)も
使えるんですよ。

細い線をピーッっと飛ばしてですね、
判定も出来るんですよ。


何故使わないのかと言うと、
線なので細すぎるんですよ。

地面の端に行くと、
キャラクターが落ちなくても
「地面に乗っていない」と判定されて
しまう可能性があります。

↓こんな感じに
無題1.png

これを回避する為にわざわざ
仮想の球を使って判定する訳です!

どうです、面倒くさいでしょう?
でも、これが一番正確かと。

少し弱点もあるんですけどね…。
それは後で説明します!


では、Physics.ShereCast()の
()の中を説明していきましょう。
Physics.SphereCast(発射の原点, 仮想の球の半径, 発射する方向, 当たった物の情報, 最大距離)


上のを読めば大体分かると思います。

というか、丸っきりそのままです。


唯一、ん?と思うやつは
「当たった物の情報」ってやつですかね?


まぁこれもそのままなんですが、
「当たった物がオブジェクトか」や
「タグはGroundか」など、色々使えます。


ですが必ず必要なのが、
hitと言う変数を宣言しておく」事です。

変数の型は「RaycastHit」です。
(……確か)

覚えなくても生きていける予備知識を
下に少し書いておきます。

そこから「あ、そうなるんだ」というのを
探してみてください。
上のコードや、ここにある全コードを
見てもいいですね。



■予備知識■■■■■
変数 : RaycastHit hit;
記述 : out hit

変数 : RaycastHit _Hit;
記述 : out _Hit;
■■■■■■■■■■



()の中の一つ一つを見ていきましょう。
原点
 this.gameObject.transform.position
 ↑これでこのゲームオブジェクト(プレイヤー自身)の位置を取得し、
 それに new Vector3(0, 2f, 0)
 これ、「高さが2であとは全部0の三次元ベクトル」を足すことで、
 プレイヤー自身の位置より2だけ高い位置からRayを飛ばす様にします。

仮想の球の半径
 transform.lossyScale.x
 ↑これはプレイヤー自身の「横の」大きさですね。
 thisが付いていませんが、このオブジェクトを使っています。
 ……実は、thisとか要りません。
 分かり易くする為に書いているだけですので…。
 lossyScaleで大きさが取得出来るので、それの横、x を使っていますね。
 何故0.5を掛けて半分にしているか分かりますよね?
 プレイヤーの(横の)大きさに合わせるためですよ!
 ここで設定出来るのは「半径」なので、「プレイヤーの直径」に0.5を掛けて半分にし、半径として扱います!

発射する方向
 Vector3.down
 これは、三次元ベクトルの下、まぁつまりプレイヤーの向きに関係なく下向きに発射しろ、って事ですね。

当たった物の情報
 これはさっき少し説明したので良いかと思います。
 当たったオブジェクトの判定に使ったりします。

最大距離
 そのままですね。
 球が飛んでいける距離です。
 ここでは2fとしていますが、永遠に伸ばしていきたい時は
 Mathf.Infinity と記述すればいけますよ。
 (2f、別に f は要りません…)


無駄話が多すぎて長くなりましたが、
FixedUpdateをまとめましょう。

もう丸暗記、の方が早いです!

「ここをこうしとけば取り敢えずこうなる」

みたいな感じで!

今回で言うと、
if (Physics.SphereCast(this.gameObject.transform.position + new Vector3(0, 2f, 0), transform.lossyScale.x * 0.5f, Vector3.down, out hit, 2f)) {
 仮想の球が当たっている時の処理;
} else {
 仮想の球が当たっていない時の処理;
}


……完璧です。
もう言い残す事はありません……!




とまぁ、そんな感じで
地面に仮想の球が当たっている時は
isGroundedをtrueに、
当たっていない時はfalseにしているだけです。


FixedUpdateは以上になります。


Update関数

さて、いよいよ最後ですね。
疲れてきたので手短にいきます。
void Update() {
 if (isGrounded) {
  InputHorizontal = Input.GetAxis("Horizontal");
  InputVertical = Input.GetAxis("Vertical");
  InputMagnitude = new Vector3(InputHorizontal, 0, InputVertical);

  jumpPower = 30f;

  //*****移動*****//
  Cam_forward = Vector3.Scale(Cam.transform.forward, new Vector3(1, 0, 1)).normalized;

  move_forward = Cam_forward * InputVertical + Cam.transform.right * InputHorizontal;

  rb.velocity = move_forward * moveSpeed + new Vector3(0, rb.velocity.y, 0);

  //移動方向に向きを変える
  if (move_forward != Vector3.zero) {
   transform.rotation = Quaternion.LookRotation(move_forward);
  }
  //***************//
 }
}


文章でダラダラ書いていると
読みにくいと思うので、新しい
解説方法を試します!
まぁ、まとめ方をちょっと
簡単にするだけなんですが。
(↑どうでもいい)


if (isGrounded) { ・・・・・・ }
if構文は、()の中がtrueの時に実行
つまり、isGroundedがtrueの時
 ↓
接地している時に {} 内を実行する!
…………以上。

InputHorizontal = Input.GetAxis("Horizontal");
Input.GetAxis("Horizontal")で
「横方向のキーの入力」がfloat型で
取得出来ます!

横方向、というのは設定次第で
変わりますが…。
主に A, D キーや←→キーの事です。

それの入力を取得し、
InputHorizontal変数に入れています。

InputVertical = Input.GetAxis("Vertical");
これは上の横方向の入力の
縦バージョンです。

W, S キーや↑↓のキーの入力を
少数型で-1〜1の間で取得し、
InputVertical変数に入れています。

良ければ↓の動画も参考にして下さい。


InputMagnitude = new Vector3(InputHorizontal, 0, InputVertical);
「横の入力 + 0 + 縦の入力」で、
その値の三次元ベクトルを作成します。

「高さ」を制御する
キー入力は無いので、y軸は0です。

これはまた後日使います。

2017/9/13 追記
記事を見直したところ、
意味の分からない事が書いてあったので
↑を書き直しました。


jumpPower = 30f;
これはなんというか……
そのままですね。

jumpPower変数に30を
代入しているだけですね。

jumpPower変数は、確かfloat型で
宣言していました。

ですので30f、floatですね。
まぁ少数点が無いのでfは無くても
良いんですけどね(笑)

Cam_forward = Vector3.Scale(Cam.transform.forward, new (1, 0, 1)).normalized;
これは少し難しいですね。

・Vector3.Scale(a, b)
 a, bどちらとも三次元ベクトルが入り、
 その二つを掛け合わせた数を出します。
 つまり、a × bですね。

aには「カメラの正面を丸ごと」
bには「新しい(1, 0, 1)の三次元ベクトル」

これを掛け合わせるので、
「yだけが0」になるんです。

もしこれが無いと、
僕の場合「カメラの正面に向かって進む」
という処理をするので、
カメラが少しでも下に向いていたら
地面にめり込んで行く始末です。
無題3.png
ですのでyだけを0にし、
向き…ですかね?
を、正面に直しています。
無題4.png

・Vector3.normalized
 三次元ベクトルの向き(角度)は
 そのままで、長さのみを全て1に直します。


何故わざわざ値を1にするのか?
それは、使う目的にあります。

変数の名前からも分かる通り、
カメラの正面、というか
カメラの向きからプレイヤーが
進める向きを算出しますよね?

その為、必要なのは「向き」です。
長さは正直どうでも良いのです。

ま、ここだけですが。
要らないのは。

後に(次の行ですが)出てくる計算で使います!
ので、全て1にし、計算しやすくしています。

(参考に)


move_forward = Cam_forward * InputVertical + Cam.transform.right * InputHorizontal;
予め一つ一つを説明しておきます。
・move_forward ・・・ 進む方向を入れておく変数
・Cam_forward ・・・ 上で算出したプレイヤーが進む、カメラの正面
・InputVertical ・・・ 縦のキー入力
・Cam.transform.right ・・・ カメラの右
・InputHorizontal ・・・ 横のキー入力

これを少し頭に入れておいて下さい。

この一行は、「入力から進む方向を決める」というものです。

カメラに対して前(奥)に入力したのか、
右に入力したのか、とかです。

それでは、少しずつばらして見ていきましょう。

・Cam_forward * InputVertical
 これのInputVerticalですが、
 縦の入力は「-1〜1」の間で取得します。

 前入力(奥側、W)をした場合は 1 、
 後ろ入力(手前側、S)の場合は -1 、
 何も入力が無い場合は 0 、と
 入力に合った数値が返ってくるので
 カメラの正面にその値を掛けています。

 入力が正の数か0か負の数かで
 前後どちらに進んでいるか分かりますね。

・Cam.transform.right * InputHorizontal
 これはさっきの縦入力の横バージョンですね。

 Cam.transform.rightでカメラの右側を取得し、
 InputHorizontalの横入力値を掛けています。

 横入力は、左(-1、A)、右(1、D)です。
 これで左右どちらに進むのかが分かります。

それで、縦の進む方向と横の進む方向を
足していますが...。

個人的には、これは感覚の方が大切かと思います。

なんか、縦と横で足しとけば斜めとかでも進めそうじゃん

これで一発です。

rb.velocity = move_forward * moveSpeed + new Vector3(0, rb.velocity.y, 0);
rbがありますね!
まず初めに!

rbには何が入っていましたっけ?
忘れてませんよね、「Rigidbody」
つまり「物理演算」です。

velocityとは、「速度」の事です。

学校で習ったんですが、速度には
「進む方向」と「進む速さ」の二つが
必要らしいです。

それは少し置いといて、
「rb.velocity」で速度を取得出来ます。

それに
「進む方向」×「進む速さ」+「重力」
の値を取得した速度に代入しています。

余談ですが、進む方向は
-1とか0とか1とかの次元です。
これだけでは進めません。

だから、速さを掛けるわけですね。

if (move_forward != Vector3.zero) { ・・・・・・ }
これは、move_forward変数が
Vector3.zero、つまり Vector3(0, 0, 0) で
無ければ { } の中を実行する、という
事になっています。

条件の方を少し詳しくやりましょう。

move_forward変数が (0, 0, 0)に
なるのは、進む方向が無い時。

つまり、ほとんどありません…。
(詳しい事は分からないので恐らくですが…。)

まぁ言葉に直すと、
「回転する必要がある時」
に実行されます。

そういえば、「!=」覚えていますか?
「左辺と右辺が等しくない」です。

覚えておきましょう。

transform.rotation = Quaternion.LookRotation(move_forward);
少し飛びますが、
Quaternion.LookRotation(三次元ベクトル)」
で三次元ベクトルをQuaternionとして
扱うことが出来ます。

どういう事かというと…。
まず頭に入れておいて欲しいのが
それぞれの「」です。

今まで使ってきた型は、
「Vector3」です。
ですが、回転を扱える型は
「Quaternion」です。

この二つ、(将来的にも)大切です!

そして、変えたいのはなんでしたっけ?
「進む方向に、向き・・を」
変えたいんですよね?

それで、進む方向として
扱ってきた変数の型はなんですか?

Vector3ですよね?

ですから、
「Vector3をQuaternionにする」
いう事が必要です。

そこで、この一行が
役に立っている訳ですね。

あとはやっている事は簡単です。
transform.rotationで
このオブジェクトの回転を取得、
Vector3からQuaternionに直した値を
代入して実際に角度を変更しています。





終わりに

長い記事を読んで頂き、
ありがとうございました!


お疲れ様でした!









2017年07月26日

「3DのARPGを作ってみよう!」ゲームの完成イメージ!

この記事、絶対最初に載せるべきでしたよね......。
忘れていた...。



気を取り直して、
この記事のカテゴリーである、

「3DのARPGを作ってみよう!」

の完成イメージをYouTubeにアップしました。



大体は、このイメージを目指していきますが、
もう少し「ゲームとしてプレイできる」レベルまで
引き上げたいと思っています!


ですので、動画にあるのに実装しなかったり、
動画にないものが実装されたりと...。

そんな事があると思います。

まぁ、気長に付き合って下さい!



スポンサードリンク








2017年07月25日

unityでプレイヤーを動かす:変数の解説

前に出して実装した
プレイヤーの移動のプログラムの、
変数部分を解説します。


プログラムの理解は大事なんですけど、
上手く説明出来てるかどうか…


というか、こんなチマチマ記事を出すより、
一気に出した方が良いんだろうか…。


まぁ、それはそれでまた考えます。


そろそろ本題に入りましょう。

スポンサードリンク




変数部分


まず、変数はどこかというと、
public Animator anim;

public bool isGrounded;

public RaycastHit hit;

public float InputHorizontal;
public float InputVertical;
public Rigidbody rb;
public float moveSpeed;
public float jumpPower = 30f;
public GameObject Cam;
public Vector3 Cam_forward;
public Vector3 move_forward;
public Vector3 InputMagnitude;

これですね。

これが変数の全体図になります。


この中の初めの一行、
public Animator anim;


これは、キャラクターを
走らせる、歩かせる、剣を振るなどの
「アニメーション(キャラの動き)」を
設定するのに使います。

ですが正直いって今回の
「プレイヤーの移動」には要らないので
説明は後回しにして、また後日ですね。


public bool isGrounded;

これは、接地判定に使います。

処理の方は後日説明しますが、
地面に着いているか、いないか
を判定します。


地面に着いていれば true、
着いていなければ false として使います。


public RaycastHit hit;

これも接地判定で使います。


「地面に当たっているか」を
判定するのに使います。


public float InputHorizontal;
public float InputVertical;

これらは上から順に、
横の入力
縦の入力となっています。

プレイヤーの移動にはキー入力が
欠かせませんので、この2つの変数に
「入力時の数値」を代入して使います。



public Rigidbody rb;

これは、物理演算です。
重力や、力を加えるのに使えます。


本プログラムでは、
この変数へは必須です。



何故かというと、本プログラムでの移動は
物体に「加速度」を加える事で
移動を表現します。


他にも位置自体を移動させたり
unityにある「キャラクターコントローラー」
というのも使えます。


ですが個人的にキャラクターコントローラーは
好きではありませんのでこれの移動はまた記事を…
………書くかなぁ?



public float moveSpeed;
public float jumpPower = 30f;

これらは上から順に
移動速度ジャンプさせる力です。


ジャンプは、「上向きに力を加えて」
表現するため、この様に「どのくらいの力か」を
決めておきます。



public GameObject Cam;
public Vector3 Cam_forward;
public Vector3 move_forward;

Camは、移動の方向を決めるためのカメラです。


必要があればプログラムで取得しますが、
今はインスペクタからで良いでしょう。


Cam_forwardは、
「プレイヤーが進むべき正面」です。

カメラの向きからキャラクターが
進む、正面として使います。


move_forwardは、カメラの向きに関係なく、
入力から進む方向を決める」のに使います。


例えば、カメラの正面に対して
後ろに進むのか右に進むのか、など
「キーの入力」からの進む方向を扱います。



public Vector3 InputMagnitude;

これで変数は最後ですね。


これは何に使うのかというと、
入力の大きさ」で使います。


例をあげると、
「キーの押し込みが
 小さすぎる場合は移動しない」
という処理を作るのに役立ちます。


終わりに

以上が変数全体となります。

ここでは大体のイメージしか
記述していないので、
分からなかったところもあるかと ^_^;


そこは、実際の処理を解説する時に
もう少し詳しくやるのでご安心を!


では、この辺にしたいと思いますが……。

……未だに記事を一括で書くかどうか
結論が出ません……。

どちらの方が良いのでしょうか…?



スポンサードリンク






2017年07月24日

ゲームプログラム アクションロールプレイングゲームを作る youtube動画アップのお知らせ

youtubeに、unity5でarpgの接地判定の動画を
アップしました!



以前の動画も見ていってください!

チャンネル登録もお願いします!



スポンサードリンク






検索
プロフィール
ピノまっちゃさんの画像
ピノまっちゃ
どうも、ピノまっちゃ(PinoMatcha)です!
ゲーム制作をちょこまか頑張ってる大学生で、プログラミングも独学です。
ですので実力は全然ですが、最善を尽くして頑張っております!

名前の由来はピノの抹茶味が好きだからじゃなくて、ピノと抹茶が好きだからです!


更新 : 不定期!
プロフィール
新着記事
最新のコメント
更新事項
2018/8/2 定期更新への変更の報告に追記しました。

2018/5/10 「続きを読む」機能の使い方がやっと分かりました。

2017/9/14 プレイヤーを動かす:関数の解説の一部を書き直しました。

2017/8/1 【unity5】カメラ移動・回転させる方法に多数の画像を追加しました。
カテゴリーアーカイブ
YouTubeチャンネル
Fantiaリンク
よければ応援お願いします!

Pixivアカウント
現在、調整中です…
×

この広告は30日以上新しい記事の更新がないブログに表示されております。