20210127のUnityに関する記事は5件です。

謎の力を棒に与えたかった

抽象的な表現で申し訳ないのですが、棒に謎の力を与える必要がありました。
メモ代わりに使わせていただきます。

Image from Gyazo

  • アンカーポイントの変更
  • 角度を求めて代入

アンカーポイントの変更

Unityでは基本的にGameObjectの真ん中にセンターが来るようにデザインされています。
今回は物体の端にアンカーポイントを置きたかったので、空のGameObjectを配置して、以下のスクリプトをアタッチ。

public class Gizmo : MonoBehaviour
{
   public float gizmoSize = 0.1f;
    public Color gizmoColor = Color.yellow;

    void OnDrawGizmos()
    {
        Gizmos.color = gizmoColor;
        Gizmos.DrawWireSphere (transform.position, gizmoSize);
    }
}

ヒエラルキーの方は、空のゲームオブジェクトの下に置きたいオブジェクトを配置します。
Image from Gyazo

こちらの記事を参考(というかほぼそのまま)利用させていただきました。

角度を求めて代入

原点はわかっていたので、だいたいこのへんから取ろうと決めた座標を使って角度を求めました。

float rad = Mathf.Atan2(modelpos.y,modelpos.x);
float moveY = 90 - rad * Mathf.Rad2Deg;

上記の参考はこちらの記事をを利用させていただきました。

このときに、GameObjectが何でも良いように、

[SerializeField]GameObject targetmodel;

上記のように宣言して、参照元が何でも良いようにUnityでフィールドを見れるようにしました。

Quautanionのりお会が全く追いつかなかったため、今回は Quaternion.Euler を使って値を代入しています。

gizmo.transform.rotation = Quaternion.Euler(2.61f,-7.06f,moveY/2);

rotationは、Quaternionを代入せねばいけませんが、上記のように雑にVector3みたいなのが代入ができるので便利です。
教えていただいたのはLookAt()関数でしたが、今回は使用しませんでした。

以上メモでした。

もっとこうすれば簡単だよ!ということがありましたら教えていただけると幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity C# ランゲーム:敵の攻撃の狙いをランダムにする方法について

こんにちは、連日 Qiitaで質問させて頂いてます。はせがわです。

また、皆さんのお力をお借りしたく質問させて頂きます。

今作っている物

Unityで
「盾一枚で依頼人を敵の攻撃から守りながらゴールまで送り届けるランゲーム」
を作っています。

aaaaa.png

プレイヤーは、自動前進で敵がPlayerまたは依頼人を狙って放物線上に飛んできます。
※現状は、playerのみをターゲットにしています。

実現したい事

敵の攻撃は、3パターン作り、そのパターンをランダムで実行したいと思っています
パターン1は、プレイヤーをそのまま狙ってくるパターン
パターン2は、依頼人を狙ってくるパターン
パターン3は、下記のペライチのような、ランダム範囲で攻撃してくる
無題のプレゼンテーション.jpg

しかし、現状 Z軸が動いてしまい、盾の後ろの方にターゲットが移動してしまいます。
※現在、ターゲットは、プレイヤーの前身移動速度を考慮して、盾の少し前に設定しています。
 Z位置は、そこで固定して YとX軸だけでターゲットがばらついてほしいと思っています。

【参考動画】
https://youtu.be/-LhvG5ULkfk

クリアしたい課題

・3つ目の ランダム攻撃が実装できません。
 どうか、お力を貸してください。。。

[Github]
https://github.com/hasegawadesu/ShieldRunner-VR-.git

[射出Code]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class throwingscript : MonoBehaviour
{


    //☆
    private float InstantiationTimer = 0f;
    // ターゲットオブジェクトの Transformコンポーネントを格納する変数
    public Transform target;//☆
    // オブジェクトの移動速度を格納する変数
    public float moveSpeed;//☆
    // オブジェクトが停止するターゲットオブジェクトとの距離を格納する変数
    public float stopDistance;//☆
    // オブジェクトがターゲットに向かって移動を開始する距離を格納する変数
    public float moveDistance;//☆  

    //<summary>
    //testtest
    //射出するオブジェクト
    //</summary>
    [SerializeField, Tooltip("ThrowingObject")]
    private GameObject ThrowingObject=null;

    //<summary>
    //標的のオブジェクト
    //</summary>
    [SerializeField, Tooltip("TargetObject")]
    private GameObject TargetObject=null;

    //<summary>
    //射出角度
    //</summary>
    [SerializeField, Range(0F,90F), Tooltip("ThrowingAngle")]
    private float ThrowingAngle=0;

    // Start is called before the first frame update
    private void Start()
    {
     Collider collider = GetComponent<Collider>();
     if(collider != null)
     {
         //干渉しないようにisTriggerをつける 
         collider.isTrigger = true;
     }   
    }

    // Update is called once per frame
    void Update()
    {

     // ゲーム実行中に毎フレーム実行する処理

        //☆ 変数 targetPos を作成してターゲットオブジェクトの座標を格納
        Vector3 targetPos = target.position;//☆
        // 自分自身のY座標を変数 target のY座標に格納
        //(ターゲットオブジェクトのX、Z座標のみ参照)
        targetPos.y = transform.position.y;//☆
        // オブジェクトを変数 targetPos の座標方向に向かせる
        transform.LookAt(targetPos);//☆

        // 変数 distance を作成してオブジェクトの位置とターゲットオブジェクトの距離を格納
        float distance = Vector3.Distance(transform.position, target.position);//☆
        // オブジェクトとターゲットオブジェクトの距離判定
        // 変数 distance(ターゲットオブジェクトとオブジェクトの距離)が変数 moveDistance の値より小さければ
        // さらに変数 distance が変数 stopDistance の値よりも大きい場合



        if (this.transform.position.z-15 < target.transform.position.z)
        {
            Destroy(gameObject);
        }

        else if (distance < moveDistance && distance > stopDistance)//☆
        {
            ThrowingBall();
        }

    }
    //<summary>
    //ボールを射出する
    //</summary>
    private void ThrowingBall()
    {
        InstantiationTimer -= Time.deltaTime;
        if (ThrowingObject !=null && TargetObject !=null && InstantiationTimer <0)
        {
            //Ballオブジェクトの生成
            GameObject ball = Instantiate(ThrowingObject, this.transform.position, Quaternion.identity);
            InstantiationTimer =2f;

            //標的の座標
            float x = Random.Range(0.0f, 2.0f);
      float y = Random.Range(0.0f, 2.0f);
            float z = Random.Range(0.0f, 2.0f);
           Vector3 targetPosition = TargetObject.transform.position;
           TargetObject.transform.position = new Vector3(x, y, z);

            //射出角度
            float angle = ThrowingAngle;

            //射出速度を算出
            Vector3 velocity = CalculateVelocity(this.transform.position, targetPosition, angle);

            //射出
            Rigidbody rid = ball.GetComponent<Rigidbody>();
            rid.AddForce(velocity * rid.mass, ForceMode.Impulse);
        }


            }

    //<summary>
    //標的に命中する射出速度の清算
    //</summary>
    //<param name="pointA">射出開始座標</param>
    //<param name="pointB">標的の座標</param>
    //<returns>射出速度</returns>
    private Vector3 CalculateVelocity(Vector3 pointA, Vector3 pointB, float angle)
    {
        //射出角をラジアンに変換
        float rad = angle * Mathf.PI / 180;

        //水平方向の距離x
        float x = Vector2.Distance(new Vector2(pointA.x,pointA.z),new Vector2(pointB.x, pointB.z));

        //垂直方向の距離y
        float y = pointA.y - pointB.y;

        //斜方投射のこうしきを初速度について解く
        float speed = Mathf.Sqrt(-Physics.gravity.y * Mathf.Pow(x,2)/(2*Mathf.Pow(Mathf.Cos(rad),2)*(x * Mathf.Tan(rad)+y)));

        if(float.IsNaN(speed))
        {
            //条件を満たす初速を算出できなければVector3.zeroを返す
            return Vector3.zero;
        }
        else
        {
            return (new Vector3(pointB.x - pointA.x, x * Mathf.Tan(rad), pointB.z-pointA.z).normalized*speed);    
        }
    }
}


なにとぞ、よろしくお願いします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

# Unity始めて1週間で最初のゲーム作ったら完全理解した

Unityってこんな概念で作るのか、が分かる程度ですが。

作ったもの

こちらからPCのブラウザで遊べます
https://unityroom.com/games/spaceexplorer
スクリーンショット 2021-01-27 14.03.16.png

基本的にUdemyのコースに沿って学習/作成

学習にはこちらのコースを使っており、同様のゲームを作成しながら学べます。
Complete C# Unity Game Developer 3D

一本目のゲームを作るのに必要だった要素技術

Unityエディタ上でのオブジェクトの配置操作

Unityは非常に優れた3Dエディタを有しており、小規模なゲームであればGUI上で3D空間を作れます。
ただ慣れないとどこをどういじっていいのか分からないため、1つゲーム画面を作ってみると感覚が掴めます。

オブジェクトにスクリプトを付与して動かすという考え方

Unityを触るまでは、多数の3Dオブジェクトがお互い作用する処理をどう書くのか検討もつきませんでした。
が、実際作ってみると非常にシンプルで、

  • オブジェクトを配置する
  • オブジェクトにスクリプトを付与する
  • スクリプトに基づいてオブジェクトが振る舞い、オブジェクト同士で相互作用する

というだけでした。

どのメソッドがどのタイミングで呼ばれるのか理解すれば、その中に処理を書くだけでその通りに動いてくれます。

処理のトリガー

スクリプトの処理を走らせるに当たって、

  • ゲームが始まったら
  • ゴールしたら
  • 衝突したら
  • キー入力があったら

あたりが自分でできるようになると、ゲーム内でおきる一般的な事象に対してスクリプトを動かして処理出来るようになります。

シーンという構成単位

  • ゲームのトップ画面
  • 複数ステージ などを作りたくなった場合に、シーンという単位で個々に作る必要があります。 シーン間の遷移の実装方法が分かると、複数画面のゲームでも自在に作れるようになります。

Unity Asset storeとの仲良くしかた

無料で良い感じのアセットが沢山あります。すごい。
Unity触るまではいっぱい公開されているんだなーくらいにしか思ってアセット等が、自分のゲームにどう使うかを考えながらみることが出来ます。楽しい。

その他ゲームの構成要素

  • 音を出す/止める
  • 光を当てる
  • エフェクトを出す

など、個別に調べてそれ通りにすれば比較的簡単に出来ました。

終わりに

とりあえず1本ゲーム作ってみると、Unityのイメージが湧いてとても楽しいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】InputFieldにTabを押したら次へ行くという処理を追加する

SwitchInputField.cs
using UnityEngine;
using TMPro;

public class SwitchInputField : MonoBehaviour
{
    public TMP_InputField thisInputField;
    public TMP_InputField nextInputField;

    // Start is called before the first frame update
    void Start()
    {
        thisInputField = GetComponent<TMP_InputField>();
    }

    // Update is called once per frame
    void Update()
    {
        if(thisInputField.isFocused && Input.GetKeyDown(KeyCode.Tab))
        {
            nextInputField.Select();
        }
    }
}

//使い方
InputFieldコンポーネントを持っているオブジェクト自体にAdd Componentします。
Tabを押した時に選択されて欲しいオブジェクトをnextInputFieldにアタッチ or スクリプトから代入します。

//TextMeshProを使わない方向け
using TMPro; => using UnityEngine.UI;
TMP_InputField => InputField
という風に読み替えてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

#1【初心者】HTC VIVE Pro Eyeの使ってUnityでVRの開発を行ってみる.「Unityのセットアップをする」

はじめに

研究費でHTC VIVE Pro Eyeを購入した.16万なので個人で買うには高すぎる代物だが今後は安くなるかもしれないし一応メモ書きしていく.
前提として,VR動画やゲームは見れるようにセットアップは済んでるものとしています.もし終わってなければここからインストーラをダウンロードしてセットアップしておく.(途中でSteamVRのインストールもさせられる)

環境一覧
SteamVR 1.15.19
Unity 2020.1.17f1

インテル® Core™ i7-7700K
NVIDIA GeForce GTX 1070

  • 環境作成編

#1 Unityのセットアップをする(この記事)2021 1月更新

今回の記事では,

1.Unityをインストールする.
2.ライセンスを追加する.
3.開発環境をインストールする.

という流れ.

1.Unityをインストールする.

Unityの公式サイトから,Unity Hubをダウンロードしてくる.

01.png

インストーラを起動して指示通りに進む.

02.png

03.png

インストール先は基本デフォルトのままで大丈夫.

04.png

終了時にUnity Hubを起動する.

05.png

2.ライセンスを追加する.

起動したら左下に有効なライセンスがありませんと出るのでライセンスを管理を押す.

06.png

そうするとライセンスを管理するにはログインが必要です.とポップアップが出るのでログインを押す.
右上のアイコンからログインしても大丈夫.

07.png

もしアカウントを持ってなければIDを作成する.

08.png

とりあえずログインします.

09.png

ライセンス管理画面が開くので,新規ライセンスの認証を押す.

10.png

ライセンスは「Unity Personal」の「Unityを業務に関連した用途に使用しません.」を選択して実行を押す.(もし販売するなら別のライセンスですが必要です)

11.png

ライセンスにPersonalが追加されていれば大丈夫.

12.png

3.開発環境をインストールする.

左上の矢印からUnity Hubのトップページに戻る.

13.png

左のメニューからインストールタブを開く.

14.png

右上のインストールボタンを押す.

14-2.png

今回使用するバージョンはUnity 2020.1.17f1
バージョンが違うと中身が全然違うので注意.基本2020.1まで合ってれば内容は大体一緒.

22.png

どのモジュールを加えるかを聞かれるので,「Microsoft Visual Studio Community 2019」「Documentation」「日本語」の3つにチェックを入れ,次へを押す.

23.png
17.png

自動でインストールが始まる.Visual Studioのインストーも自動で立ち上がる.

27.png

これでプロジェクト作成準備が完了.

28.png

とりあえずこれで開発環境の設定は完了,次回はプロジェクトを作成していく.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む