前提・実現したいこと
建物の中のカメラの動きについて、被写体を追いかけるカメラが壁を映してしまいます。
カメラと被写体の間に壁が存在する時は、壁を映さないまたはカメラを近づけるという機能を実装したいです。
前者はRaycastを使用して壁を判定し、非表示にする方法で実現しましたがカメラを動かす度に壁が映ったり消えたりを繰り返すので実用的ではなく困っています。
色々な実装方法があるかとは思いますがカメラが壁を映さないようにする方法についてアドバイスをいただけたらと思います。
試したこと
https://qiita.com/sakura-crowd/items/3608b2fd6df8a953240a
こちらを参考に作成しました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
被写体からカメラに向かって衝突判定を行い、最初に衝突した位置にカメラを移動するというのはどうでしょうか。
C#
1using UnityEngine; 2 3[RequireComponent(typeof(Camera))] 4public class CameraController : MonoBehaviour 5{ 6 [SerializeField] private Transform targetTransform; 7 [SerializeField] private float angularSpeed = 30.0f; 8 [SerializeField] private string horizontalAxis = "Horizontal"; 9 private Transform cameraTransform; 10 private float distance; 11 private float angle; 12 private Vector3 initialDirection; 13 14 [Header("Obstacle Avoidance")] 15 [SerializeField] private bool avoidObstacles = true; 16 [SerializeField] private LayerMask obstacleLayers = 1; 17 [SerializeField] private float cameraRadius = 0.5f; 18 [SerializeField] private float smoothTime = 0.125f; 19 private float actualDistance; 20 private float distanceVelocity; 21 22 private void Start() 23 { 24 this.cameraTransform = this.transform; 25 this.cameraTransform.LookAt(this.targetTransform); 26 this.distance = Vector3.Distance(this.cameraTransform.position, this.targetTransform.position); 27 this.actualDistance = this.distance; 28 this.initialDirection = (this.cameraTransform.position - this.targetTransform.position).normalized; 29 } 30 31 private void LateUpdate() 32 { 33 // まず障害物は考慮せずにカメラを移動・回転させる 34 var deltaAngle = Input.GetAxis(this.horizontalAxis) * this.angularSpeed * Time.deltaTime; 35 this.angle -= deltaAngle; 36 var direction = Quaternion.Euler(0.0f, this.angle, 0.0f) * this.initialDirection; 37 this.cameraTransform.position = this.targetTransform.position + (direction * this.distance); 38 this.cameraTransform.LookAt(this.targetTransform); 39 40 // 障害物回避を行わないならばここで処理終了 41 if (!this.avoidObstacles) 42 { 43 return; 44 } 45 46 // ターゲットからカメラに向かってヒットテストを行い、 47 // ヒットしていればそれを目標距離に、さもなくば 48 // 本来の距離を目標距離とする 49 var targetDistance = Physics.SphereCast( 50 this.targetTransform.position, 51 this.cameraRadius, 52 direction, 53 out var hitInfo, 54 this.distance, 55 this.obstacleLayers) 56 ? hitInfo.distance 57 : this.distance; 58 59 // 目標距離へなめらかに移動させるためスムージングを行い... 60 this.actualDistance = Mathf.SmoothDamp( 61 this.actualDistance, 62 targetDistance, 63 ref this.distanceVelocity, 64 this.smoothTime); 65 66 // 最終的なカメラ距離に合わせてカメラの位置を再調整する 67 this.cameraTransform.position = this.targetTransform.position + (direction * this.actualDistance); 68 } 69}
たぶんCinemachineColliderとかも似たような感じでやっているんじゃないでしょうかね?
投稿2020/05/18 20:34
総合スコア10811
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/19 12:08
2020/05/19 12:22
2020/05/19 13:12
2020/05/19 14:30
2020/05/20 15:20