对象跟随玩家

时间:2015-04-11 15:39:54

标签: c# unity3d

我在Unity中乱搞,想要制作一个机制,其中一个盒子会碰到另一个物体然后该物体会跟随玩家。

我的Cube设置如下:Cube Inspector

带有相同选项的Box Collider的球体。

我的播放器脚本因此:

public class Player : MonoBehaviour {

public float speed = 0.0f;
public float moveX = 0.0f;
public float moveY = 0.0f;
public GameObject player;
public GameObject obj;
//public float force = 0.0f;
private bool collided = false;


// Use this for initialization
void Start () {
    player = GameObject.FindWithTag ("Player");
}

// Update is called once per frame
void FixedUpdate () {
    moveX = Input.GetAxis ("Horizontal");
    moveY = Input.GetAxis ("Vertical");
    player.GetComponent<Rigidbody> ().velocity = new Vector2 (moveX * speed, moveY * speed);    
}

void OnCollisionEnter (Collision col) {
    if (col.gameObject == obj) {
        collided = true;
    }
}

void OnCollisionExit (Collision col) {
    if (col.gameObject == obj) {
        collided = false;
    }
}

void Update () {
    if(collided) {
        obj.transform.position = (player.transform.position - obj.transform.position)*speed;
    }
}

}

我还有什么要做的?希望有人能够朝着正确的方向推动我。

1 个答案:

答案 0 :(得分:3)

我将为您提供两个脚本。

第一个脚本是FollowTarget。这将强制执行你的目标。

第二个脚本是SmoothFollow,它将平稳地跟随你的目标。

FollowTarget.cs

using System;
using UnityEngine;

public class FollowTarget : MonoBehaviour
{
    public Transform target;
    public Vector3 offset = new Vector3(0f, 7.5f, 0f);


    private void LateUpdate()
    {
        transform.position = target.position + offset;
    }
}

SmoothFollow.cs

using UnityEngine;


public class SmoothFollow : MonoBehaviour
{

    // The target we are following
    [SerializeField]
    private Transform target;
    // The distance in the x-z plane to the target
    [SerializeField]
    private float distance = 10.0f;
    // the height we want the camera to be above the target
    [SerializeField]
    private float height = 5.0f;

    [SerializeField]
    private float rotationDamping;
    [SerializeField]
    private float heightDamping;

    // Use this for initialization
    void Start() { }

    // Update is called once per frame
    void LateUpdate()
    {
        // Early out if we don't have a target
        if (!target)
            return;

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

        var currentRotationAngle = transform.eulerAngles.y;
        var 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
        var 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 = new Vector3(transform.position.x ,currentHeight , transform.position.z);

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

只需选择其中一个,然后将其附加到gameObject即可。像另一个假设要遵循的方框。

删除脚本中的Update()函数,因为您不再需要它。

同时删除OnCollisionExit()

void OnCollisionEnter (Collision col) {
    if (col.gameObject == obj) {

        // If you choose to use SmoothFollow Uncomment this.
        //col.GetComponent<SmoothFollow>().target = this.transform;

        // If you choose to use FollowTarget Uncomment this
        //col.GetComponent<FollowTarget>().target = this.transform;
    }
}