質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1048閲覧

Unity カメラの制御について マウススクロールでズームしたい。

sanshi5

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/05/19 00:27

編集2020/06/09 13:34

やりたいこと

フリーである既存の3rdPersonのカメラ制御のスクリプトに
マウススクロールによるズーム機能を追加で付けたい。

やったこと

1.ズームできるスクリプトを追加で加えてみた。
カメラのトランスフォームのZを変えるやり方だと
単独では機能したけれど
既存のスクリプト制御されたカメラ位置には反映されなかった。

2.FOVの値を変えるスクリプトを追加してみた。
インアウトする感じにはなるけれど、
トランスフォームではなく画角が変わってるだけなので
ちょっとイメージと違う。最大値と最小値をつけれれば使えなくもない。

3.getcompornentでCamOffsetの値をとって
そこをマウススクロールで変えてみる。スクリプトを空のオブジェクトにつけてみた。機能しなかった。

知りたいこと

もとのプログラムのどのへんにアクセスすればズーム機能をつけられそうかを知りたい。
どのようなスクリプトを追加すればこの場合のカメラの位置がマウスで可変できるようになるかを知りたい。


やってみた1のスクリプト

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

public class CameraZoom : MonoBehaviour
{

private float scroll; public float speed = 1f; void Update() { scroll = Input.GetAxis("Mouse ScrollWheel"); Camera.main.transform.position += transform.forward * scroll * speed; }

}

--- やってみた2のスクリプト ```ここに言語を入力 using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraFOV : MonoBehaviour { float zoom; float tan0; void Start() { tan0 = Mathf.Tan(Camera.main.fieldOfView * 0.5f / 180 * Mathf.PI); zoom = 0; } void Update() { Camera.main.fieldOfView = Mathf.Atan(tan0 / Mathf.Exp(-zoom)) * 180 / Mathf.PI * 2; zoom -= Input.mouseScrollDelta.y; } }

CamOffsetの値をGetComponentしてみる。

イメージ説明
やってみた3のスクリプト

using System.Collections; using System.Collections.Generic; using UnityEngine; public class getcamoffset : MonoBehaviour { public GameObject gameobject; private float scroll; public float speed = 1f; void Update() { Vector3 CamOffset = gameobject.GetComponent<ThirdPersonOrbitCamBasic>().camOffset; Debug.Log(CamOffset); scroll = Input.GetAxis("Mouse ScrollWheel"); CamOffset = Vector3.forward * scroll * speed; } }

Unityバージョン2019.2.9f1
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2020/05/19 00:54

やってみた3のパターンで gameobject.GetComponent<ThirdPersonOrbitCamBasic>().camOffset = Vector3.forward * scroll * speed; ってやるとどうなります?(scrollが正しい値を取っているか別途確認してください)
sanshi5

2020/05/19 02:10

``` using System.Collections; using System.Collections.Generic; using UnityEngine; public class getcamoffset : MonoBehaviour { public GameObject gameobject; private float scroll; public float speed = 1f; // Update is called once per frame void Update() { gameobject.GetComponent<ThirdPersonOrbitCamBasic>().camOffset = Vector3.forward * scroll * speed; scroll = Input.GetAxis("Mouse ScrollWheel"); Debug.Log(scroll); } } ``` のように書き代えてやってみましたが、とくに書き換えるまえと同じく動きませんでした。ホイールまわしてみても コンソールでは0のままだったのでscrollが動いてない感じです。 単独でスクロールテストプログラムを走らせてみると 0.1の値がマウスをまわすごとに帰ってきます。 ``` using System.Collections; using System.Collections.Generic; using UnityEngine; public class scrolltest : MonoBehaviour { private float scroll; // Update is called once per frame void Update() { scroll = Input.GetAxis("Mouse ScrollWheel"); Debug.Log(scroll); } } ```
guest

回答1

0

ベストアンサー

(根本的に間違っていたので全面書き直し)

元コードをよく見直したところ、camOffsetの変更じゃ確かに駄目ですね。
SetTargetOffsetsというメソッドがあるのでそれを利用してみてください。

C#

1public class getcamoffset : MonoBehaviour 2{ 3 private float scroll; 4 public float speed = 1f; 5 public ThirdPersonOrbitCamBasic camBasic; //変更してます。インスペクターからD&Dし直してください 6 Vector3 pivotOffset; 7 Vector3 camOffset; 8 9 void Start() 10 { 11 pivotOffset = camBasic.pivotOffset; 12 camOffset = camBasic.camOffset; 13 } 14 15 void Update() 16 { 17 scroll = Input.GetAxis("Mouse ScrollWheel"); 18 Debug.Log(scroll); 19 20 camOffset += Vector3.forward * scroll * speed; 21 22 camBasic.SetTargetOffsets(pivotOffset, camOffset); 23 } 24}

投稿2020/05/19 02:36

編集2020/05/19 08:16
sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sanshi5

2020/05/19 03:46

ありがとうございます 赤ライン引いたところは、自分でインスペクター上で数値を入れる分にはカメラの位置は前後に変わります。初期値を設定してるだけなのでアップデートはされないのかとも考えています。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class getcamoffset : MonoBehaviour { private float scroll; public float speed = 1f; public GameObject gameobject; void Update() { scroll = Input.GetAxis("Mouse ScrollWheel"); Debug.Log(scroll); gameobject.GetComponent<ThirdPersonOrbitCamBasic>().camOffset += Vector3.forward * scroll * speed; } } 順序をかえて加算のに書き代えました。 画面を一度右クリックしたらスクロールは反応するようになり スクロールは0.1が表示されるようになりました。 Updateの中のなかなので連続して0が表示されていたのかもしれません。 コンソルを開くときマウスクリックとかそういうのが影響してたのかもしれません。 カメラは連動はしないままではあります。
sanshi5

2020/05/19 08:47

ありがとうございます。 ご提案いただいたSetTargetOffsetsのメソッドのスクリプトでマウススクロールによるズームインアウトが可能になりました。 やりたかったことにぴったりでした。大変ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問