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

这里假设在水中的船,船有惯性,在不添加前进动力的情况下会继续移动,但是船身是可以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

时间: 2024-10-10 04:00:40

Unity相机跟随-----根据速度设置偏移量的相关文章

unity 相机跟随物体(角色)

unity 相机平滑跟随游戏角色 把这个脚本赋给你的摄像机,再把游戏角色赋给character变量,之后就能实现摄像机平滑的跟随player在地球的任一角落了. using UnityEngine; using System.Collections; public class SmoothFollowerObj { private Vector3 targetPosition; private Vector3 position; private Vector3 velocity; private

unity相机跟随Player常用方式

固定跟随,无效果(意义不大) 1 public class FollowPlayer : MonoBehaviour 2 { 3 public Transform Player; 4 private Vector3 Offset; 5 6 void Start() 7 { 8 //设置差值 9 Offset= Player.position - transform.position; 10 } 11 12 void Update() 13 { 14 transform.position = Pl

unity 常用的几种相机跟随

固定相机跟随 这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 1 using UnityEngine; 2 using System.Collections; 3 4 public class CameraFlow : MonoBehaviour 5 { 6 public Transform target; 7 private Vector3 offset; 8 // Use this for initialization 9 void Start() 10 {

Unity3D 利用FSM设计相机跟随实现

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 FSM有限状态机前面已经跟读者介绍过,使用Unity3D引擎实现了动作状态以及技能切换,FSM使用的条件是有限个状态切换,我们可以将FSM应用到相机中,很多人会问在相机中如何使用FS

unity3d简单的相机跟随及视野旋转缩放

1.实现相机跟随主角运动 一种简单的方法是把Camera直接拖到Player下面作为Player的子物体,另一种方法是取得Camera与Player的偏移向量,并据此设置Camera位置,便能实现简单的相机跟随了. 这里我们选取第二种方法,首先给Camera添加一个脚本,取名为FollowPlayer,脚本很简单不做说明了 1 public class FollowPlayer : MonoBehaviour { 2 3 private Transform player; 4 private V

unity3D:游戏分解之角色移动和相机跟随

游戏中,我们经常会有这样的操作,点击场景中某个位置,角色自动移动到那个位置,同时角色一直是朝向那个位置移动的,而且相机也会一直跟着角色移动.有些游戏,鼠标滑动屏幕,相机就会围绕角色旋转. 看似很简单的操作,那么到底是怎么实现的呢? 我们把上述操作分解为以下几个步骤 角色的移动 1. 移动到下一个路点,线性插值.曲线插值 2. 角色朝向,一直面朝下一个路点 相机跟随角色 1. 相机俯视角度,决定相机的高度 2. 相机跟随距离,前向距离或者直线距离(就是三角形的水平边长或者斜边长) 3. 相机一直看

3.1 测试能否对标准输入设置偏移量

file/seek.c #include "apue.h" int main(void) { if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1) printf("cannot seek\n"); else printf("seek OK\n"); exit(0); } 3.1 测试能否对标准输入设置偏移量,布布扣,bubuko.com

以Append方式打开文件,设置偏移量无效

1 #include<stdio.h> 2 3 int main() 4 { 5 FILE * fd = fopen("btoo1.c", "ab+"); 6 fpos_t p ; 7 int fp = fgetpos(fd, &p); 8 printf("bef seek: fgetpos = %ld, ftell = %d\n", p, ftell(fd)); 9 fseek(fd, 12, SEEK_SET); 10 f

android viewPager滑动速度设置

ViewPager 滑动速度设置,并实现点击按钮滑动 使用过ViewPager的童鞋,都会感觉到设置界面滑动挺简单的.但是有时候却满足不了UI设计的要求. 在用这个ViewPager的时候我遇到两个问题,不知道你们遇到没有.这里做个笔记,总结一下: 第一个问题是,ViewPager在我们滑动放手后,速度和动画的变化率是固定的. 第二个问题的,我们再添加左右按钮后,如点击滑动到前一页面(通过mViewPager.setCurrentItem(viewID, true);),一闪就了,用户感觉不到动