web-dev-qa-db-ja.com

unity3d C#でカメラをオブジェクトに追従させるにはどうすればよいですか?

Ballというオブジェクトがあり、それにキーボードのインタラクティブ機能(ボールを移動するためのWASD)を追加しました。カメラを後ろに置いてボールを追跡する必要がありますが、エラーが発生します。

using UnityEngine;
using System.Collections;
public class ballmain : MonoBehaviour {
    public bool isMoving = false;
    public string direction;
    public float camX;
    public float camY;
    public float camZ;
    // Use this for initialization
    void Start () {
        Debug.Log("Can this run!!!");
    }

    // Update is called once per frame
    void Update () {
        camX = rigidbody.transform.position.x -=10;
        camY = rigidbody.transform.position.y -=10;
        camZ = rigidbody.transform.position.z;
        camera.transform.position = new Vector3(camX, camY, camZ);
            //followed by code that makes ball move
    }
}

「Assets/ballmain.cs(18,44):エラーCS1612:「UnityEngine.Transform.position」の値型の戻り値を変更できません。値を一時変数に格納することを検討してください」というエラーが表示されます。答えを知っている人はいますか?カメラに関するコードをコメントアウトすると、ボールが動き回ることができます。

6
chesnutcase

どうぞ 。完全なコード。

簡単なフォロー

using UnityEngine;
using System.Collections;

public class Follow: MonoBehaviour {
public Transform target;
public float smooth= 5.0f;
void  Update (){
    transform.position = Vector3.Lerp (
        transform.position, target.position,
        Time.deltaTime * smooth);
} 

    } 

高度なフォロー

using UnityEngine;
using System.Collections;

public class SmoothFollowScript: MonoBehaviour {

// The target we are following
public  Transform target;
// The distance in the x-z plane to the target
public int distance = 10.0;
// the height we want the camera to be above the target
public int height = 10.0;
// How much we 
public heightDamping = 2.0;
public rotationDamping = 0.6;


void  LateUpdate (){
    // Early out if we don't have a target
    if (TargetScript.russ == true){
    if (!target)
        return;

    // Calculate the current rotation angles
    wantedRotationAngle = target.eulerAngles.y;
    wantedHeight = target.position.y + height;

    currentRotationAngle = transform.eulerAngles.y;
    currentHeight = transform.position.y;

    // Damp the rotation around the y-axis
    currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);

    // Damp the height
    currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime);

    // Convert the angle into a rotation
    currentRotation = Quaternion.Euler (0, currentRotationAngle, 0);

    // Set the position of the camera on the x-z plane to:
    // distance meters behind the target
    transform.position = target.position;
    transform.position -= currentRotation * Vector3.forward * distance;

    // Set the height of the camera
    transform.position.y = currentHeight;

    // Always look at the target
    transform.LookAt (target);
}
}
}
5
user2423014

単にターゲットオブジェクトを追跡したいだけの場合は、カメラの位置を希望どおりに調整し、カメラをターゲットオブジェクトの子にします。

2

プロジェクトに標準のモバイルアセットを含めます。スクリプトセクションにSmoothFollow2D.jsコードが含まれています。このコードをgameobjectに添付し、パブリック変数を初期化します。これは単にあなたのために仕事をするでしょう。

1
Reaz Murshed

これは、ゲーム開発中に役立つと思ったスクリプトの1つです。私はそれらを作成しなかったので、この素晴らしいスクリプトを提供してくれたwiki.unity3d.comの功績を称えます。

スムーズなフォロー:

using UnityEngine;
using System.Collections;

        public class SmoothFollow2 : MonoBehaviour {
        public Transform target;
        public float distance = 3.0f;
        public float height = 3.0f;
        public float damping = 5.0f;
        public bool smoothRotation = true;
        public bool followBehind = true;
        public float rotationDamping = 10.0f;

        void Update () {
               Vector3 wantedPosition;
               if(followBehind)
                       wantedPosition = target.TransformPoint(0, height, -distance);
               else
                       wantedPosition = target.TransformPoint(0, height, distance);

               transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);

               if (smoothRotation) {
                       Quaternion wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up);
                       transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
               }
               else transform.LookAt (target, target.up);
         }
}

私の仕事についての詳細

1
Dilmer

このシンプルで便利なUnity2Dカメラフォロースクリプトを見つけました。

using UnityEngine;
using System.Collections;

public class FollowCamera : MonoBehaviour {

public float interpVelocity;
public float minDistance;
public float followDistance;
public GameObject target;
public Vector3 offset;
Vector3 targetPos;
// Use this for initialization
void Start () {
    targetPos = transform.position;
}

// Update is called once per frame
void FixedUpdate () {
    if (target)
    {
        Vector3 posNoZ = transform.position;
        posNoZ.z = target.transform.position.z;

        Vector3 targetDirection = (target.transform.position - posNoZ);

        interpVelocity = targetDirection.magnitude * 5f;

        targetPos = transform.position + (targetDirection.normalized * interpVelocity * Time.deltaTime); 

        transform.position = Vector3.Lerp( transform.position, targetPos + offset, 0.25f);

    }
   }
}

ソース nity2dカメラフォロースクリプト

1
NabeelSaleem

これらの行の-=

   camX = rigidbody.transform.position.x -=10;
   camY = rigidbody.transform.position.y -=10;

間違っている。 -=rigidbody.transform.positionを変更しようとします。 -が必要です。

ただし、現状では、カメラはターゲットのZ位置の変化を追跡せず、カメラを回転させても適切に追跡しません。必要な正しい位置を取得するには(ベクトルで):-

cam_pos = target_pos - dist_to_target * cam_look_at
0
Skizz