Unity相机跟随-----根据速度设置偏移量

本文详细介绍了如何在Unity中使用相机控制脚本来实现游戏内相机的动态跟随效果,通过计算角色速度在正方向上的分量,调整相机偏移量,以增强游戏体验。并提供了两种代码实现方式,一种直接根据速度调整相机位置,另一种引入了平滑过渡,以减少画面抖动。
摘要由CSDN通过智能技术生成

这里假设在水中的船,船有惯性,在不添加前进动力的情况下会继续移动,但是船身是可以360度自由旋转,当船的运动速度在船的前方的时候,相机会根据向前的速度的大小,设置相机的偏移量,从而提高游戏的动态带感。

但是由于惯性船的速度不一定在船的,因此可以获得当前船的速度方向在船的前方的投影分量,当分量与船的前方同向,那么设置偏移量为:速度分量的长度与船的最大比值t,乘以相机设定的最大偏移量

 

代码1

如下

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

public class CameraControl : MonoBehaviour {

    GameObject player;
    public float speed=10f;

最大偏移量,这里最好能保证角色在屏幕范围内
public float radius;// Use this for initialization void Start () { player = GameObject.FindWithTag("Player"); } // Update is called once per frame void Update () { Follow(); }void Follow() { if (!player) { player = GameObject.FindWithTag("Player"); } else { Rigidbody2D rigid= player.GetComponent<Rigidbody2D>(); Ship ship = player.GetComponent<Ship>(); Vector3 playerVelocity = rigid.velocity; //求出角色的速度在角色的正方向的分量速度 Vector3 playerVelocityOnForward= Vector3.Project(playerVelocity,player.transform.up); //得到分量速度的方向与正方向是否同符号 float dot = Vector3.Dot(playerVelocityOnForward, player.transform.up); //如果同符号,那么得到它的模与最大速度值的比值,用该比值乘以radius,即可得到相机的偏移位置量;如果不同号,即速度方向相反,那么比例值设置为0 float offsetLength = (dot >= 0 ? playerVelocityOnForward.magnitude / ship.maxSpeed : 0) * radius;
transform.position
= Vector3.Lerp (transform.position, player.transform.position + player.transform.up* offsetLength - Vector3.forward, Time.deltaTime * speed); } } }

 

在代码1上可以看出,在飞船开动引擎和关闭引擎时,由于速度的剧烈变化,相机也会跟着剧烈变化,玩家眼睛无法跟上画面的剧烈变化,最好的解决办法是将radius的变化放缓,从而使得相机的动作流畅,便有了代码2.

代码2:

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

public class CameraControl : MonoBehaviour {

    GameObject player;
    public float speed=10f;//相机的最大速度

    public float radius;

    float minRadius=1f;

    float currentRadius;

    // Use this for initialization
    void Start () {
        player = GameObject.FindWithTag("Player");
    }
    
    // Update is called once per frame
    void Update () {
        Follow();
    }void Follow()
    {
        if (!player)
        {
            player = GameObject.FindWithTag("Player");
        }
        else
        {
            Rigidbody2D  rigid= player.GetComponent<Rigidbody2D>();
            Ship ship = player.GetComponent<Ship>();
            Vector3 playerVelocity = rigid.velocity;
            //求出角色的速度在角色的正方向的分量速度
            Vector3 playerVelocityOnForward= Vector3.Project(playerVelocity,player.transform.up);
            //得到分量速度的方向与正方向是否同符号
            float dot = Vector3.Dot(playerVelocityOnForward, player.transform.up);
            //如果同符号,那么得到它的模与最大速度值的比值,用该比值乘以radius,即可得到相机的偏移位置量;如果不同号,即速度方向相反,那么比例值设置为0
            float offsetLength = (dot >= 0 ? playerVelocityOnForward.magnitude / ship.maxSpeed : 0)  *  radius;
            //Debug.Log(offsetLength);
            //如果按下了加速键,那么让相机在角色前方offsetLength处,否则,相机在角色前方最小偏移处
            if (Input.GetKey(KeyCode.UpArrow))
            {
                if (currentRadius <= radius)
                {
                    //currentRadius = currentRadius + Time.deltaTime * 3f;
                    //currentRadius = Mathf.Clamp(currentRadius, minRadius, radius);
                    //currentRadius = offsetLength;
                    currentRadius = Mathf.Lerp(currentRadius, offsetLength, Time.deltaTime * 3);
                };    
            }
            else
            { 
                if (currentRadius > minRadius)
                {
                    currentRadius = currentRadius - Time.deltaTime * 3f;
                }
                currentRadius = Mathf.Clamp(currentRadius, minRadius, radius); 
            }
          transform.position = Vector3.Lerp(transform.position, player.transform.position + player.transform.up * currentRadius - Vector3.forward, Time.deltaTime * speed);
} } }

 

转载于:https://www.cnblogs.com/xiaoahui/p/10463746.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值