Tekken-like camera

Hi, I’m working on this 3d fighting game, it’s almost a tekken clone. Now I need to code the camera movement. I already have the code for the camera movement, it always lookAt the side of two characters. But my problem is I can’t make it zoom Out/in as the player moves away from each other. I tried a lot of solution found in the internet but nothing solves it or related to it. Players move SSBB like in tekken, all scripts I found was for game whose characters are only moving on X-axis. Here’s my code:

using UnityEngine;
using System.Collections;

public class CameraMovement : MonoBehaviour {
    Transform player1;
    Transform player2;
    Transform mTransform;
    Transform mCenterTrans;
    public GameObject centerPoint;
    public Vector3 cameraOffset;
    public float height;

    float marginx = 3f;

    Vector3 center;
    Vector3 offset;
    void Start () {
        mCenterTrans = centerPoint.transform;
        mTransform = transform;
        player1 = Player.player1.mCharacter.mModel.transform;
        player2 = Player.player2.mCharacter.mModel.transform;
        centerPoint.transform.position = centerOfChars(player1.position,player2.position);
        offset = centerPoint.transform.position - transform.position;
    }


    void LateUpdate () {
        updatePosition ();
    }

    void updatePosition()
    {
        //calculate distance of players
        float distanceOfCharacters = Vector3.Distance (player1.position, player2.position);

        //update centerPoint position
        mCenterTrans.position = centerOfChars(player1.position,player2.position);
        mCenterTrans.LookAt (player2.position);

        //calculate for nexPosition of Camera
        float angle = (mCenterTrans.eulerAngles.y);
        float anglez = (mCenterTrans.eulerAngles.z);
        Quaternion rotation = Quaternion.Euler (0, angle,0);
        mTransform.position = mCenterTrans.position - (rotation * offset);
        center = mCenterTrans.position;

        //add height to camera
        center.y += height;
        mTransform.LookAt (center);
    }

    Vector3 centerOfChars(Vector3 pCharPos1,Vector3 pCharPos2)
    {
        return (player1.position + player2.position) * 0.5f;
    }
}

Any help if you can?

First of all, use code tags.

This one is actually really easy, and you’ve already got all the pieces in place. Just change the one line to:

mTransform.position = mCenterTrans.position - (rotation * offset * distanceOfCharacters * someMultiplier);

someMultiplier is just going to be some number you make up and plug different values into until it feels right - my guess is probably in the neighborhood of 1.5 - 2.0, assuming your camera has the standard 60 degree FOV.

1 Like

Wow thanks for quick response. I’m going to try it now. Sorry, I will edit my post

GOT IT! thanks for your help. Here’s the result

Vector3 cameraNewPos = mCenterTrans.position - (rotation * offset * (distanceOfCharacters/2f) * margin);
        cameraNewPos.x = Mathf.Clamp (cameraNewPos.x, minZoom, maxZoom);
        mTransform.position = cameraNewPos;

@StarManta , can you help me more regarding this? I’m now stuck, I need to limit it’s zooming. I have made some solution but still cause some bugs. specially if I zoom out. Here’s what my code now:

public class CameraMovement : MonoBehaviour {

    public GameObject centerPoint;
    public float minZoom = 7f;
    public float maxZoom = 15f;
    public float smoothing = 2f;

    Transform player1;
    Transform player2;
    Transform mTransform;
    Transform mCenterTrans;
    Vector3 offset;
    Vector3 posLimit;
    float minDist;
    float maxDist;

    void Start () {
        mCenterTrans = centerPoint.transform;
        mTransform = transform;
        player1 = Player.player1.mCharacter.mModel.transform;
        player2 = Player.player2.mCharacter.mModel.transform;
        centerPoint.transform.position = centerOfChars(player1.position,player2.position);
        offset = centerPoint.transform.position - transform.position;
        minDist = distanceOfCharacters (player1.position, player2.position);
        maxDist = ((minDist / minZoom) * maxZoom) + 1;
    }


    void LateUpdate () {
        updatePosition ();
    }

    void updatePosition()
    {
        //calculate distance of players
        float distanceOfChars = distanceOfCharacters(player1.position, player2.position);

        //update centerPoint position
        mCenterTrans.position = (centerOfChars(player1.position,player2.position));
        mCenterTrans.LookAt (player2.position);

        //calculate for nexPosition of Camera
        float angle = mCenterTrans.eulerAngles.y;
        Quaternion rotation = Quaternion.Euler (0, angle,0);
        Vector3 cameraNewPos = mCenterTrans.position - (rotation * offset);

        if (distanceOfChars >= minDist /*&& distanceOfChars <= maxDist*/) {
            cameraNewPos *= (distanceOfChars * 0.4f);
            posLimit = mTransform.position;
        }
        else
            cameraNewPos = (cameraNewPos) + (posLimit * 0.7f);

        mTransform.position = Vector3.Lerp(mTransform.position, cameraNewPos, Time.deltaTime * smoothing);
        mCenterTrans.position += Vector3.up;
        mTransform.LookAt (mCenterTrans.position);
    }

    Vector3 centerOfChars(Vector3 pCharPos1,Vector3 pCharPos2)
    {
        return (player1.position + player2.position) * 0.5f;
    }

    float distanceOfCharacters(Vector3 char1,Vector3 char2)
    {
        return Vector3.Distance (char1, char2);
    }
}

You can use Mathf.Clamp(distanceOfChars, min, max) to limit that number to whatever values you need.

1 Like

Thanks! So much thinking of complicated solutions, I missed a very simple answer.