zoukankan      html  css  js  c++  java
  • unity 相机平滑跟随游戏角色

    把这个脚本赋给你的摄像机,再把游戏角色赋给character变量,之后就能实现摄像机平滑的跟随player在地球的任一角落了。

    using UnityEngine;
    using System.Collections;
    
    public class SmoothFollowerObj {
        
        private Vector3 targetPosition;
        private Vector3 position;
        private Vector3 velocity;
        private float smoothingTime;
        private float prediction;
        
        public SmoothFollowerObj(float smoothingTime) {
            targetPosition = Vector3.zero;
            position = Vector3.zero;
            velocity = Vector3.zero;
            this.smoothingTime = smoothingTime;
            prediction = 1;
        }
        
        public SmoothFollowerObj(float smoothingTime, float prediction) {
            targetPosition = Vector3.zero;
            position = Vector3.zero;
            velocity = Vector3.zero;
            this.smoothingTime = smoothingTime;
            this.prediction = prediction;
        }
        
        // Update should be called once per frame
        public Vector3 Update(Vector3 targetPositionNew, float deltaTime) {
            Vector3 targetVelocity = (targetPositionNew-targetPosition)/deltaTime;
            targetPosition = targetPositionNew;
            
            float d = Mathf.Min(1,deltaTime/smoothingTime);
            velocity = velocity*(1-d) + (targetPosition+targetVelocity*prediction-position)*d;
            
            position += velocity*Time.deltaTime;
            return position;
        }
        
        public Vector3 Update(Vector3 targetPositionNew, float deltaTime, bool reset) {
            if (reset) {
                targetPosition = targetPositionNew;
                position = targetPositionNew;
                velocity = Vector3.zero;
                return position;
            }
            return Update(targetPositionNew, deltaTime);
        }
        
        public Vector3 GetPosition() { return position; }
        public Vector3 GetVelocity() { return velocity; }
    }
    public class NoGravityCamera : MonoBehaviour {    // 这里的NoGravityCamera修改成你的脚本名
    
        public GameObject character;
        public Vector3 positionVector;
        public Vector3 lookVector;
        private SmoothFollowerObj posFollow;
        private SmoothFollowerObj lookFollow;
        private Vector3 lastVelocityDir;
        private Vector3 lastPos;
        
        // Use this for initialization
        void Start () {
            positionVector=new Vector3(0,2,4);
            lookVector=new Vector3(0,0,1.5f);
            posFollow = new SmoothFollowerObj(0.5f,0.5f);
            lookFollow = new SmoothFollowerObj(0.1f,0.0f);
            posFollow.Update(transform.position,0,true);
            lookFollow.Update(character.transform.position,0,true);
            lastVelocityDir = character.transform.forward;
            lastPos = character.transform.position;
        }
        
        // Update is called once per frame
        void LateUpdate () {
            lastVelocityDir += (character.transform.position-lastPos)*8;
            lastPos = character.transform.position;
            lastVelocityDir += character.transform.forward*Time.deltaTime;
            lastVelocityDir = lastVelocityDir.normalized;
            Vector3 horizontal = transform.position-character.transform.position;
            Vector3 horizontal2 = horizontal;
            Vector3 vertical = character.transform.up;
            Vector3.OrthoNormalize(ref vertical,ref horizontal2);
            if (horizontal.sqrMagnitude > horizontal2.sqrMagnitude) horizontal = horizontal2;
            transform.position = posFollow.Update(
                character.transform.position + horizontal*Mathf.Abs(positionVector.z) + vertical*positionVector.y,
                Time.deltaTime
            );
            
            horizontal = lastVelocityDir;
            Vector3 look = lookFollow.Update(character.transform.position + horizontal*lookVector.z - vertical*lookVector.y, Time.deltaTime);
            transform.rotation = Quaternion.FromToRotation(transform.forward, look-transform.position) * transform.rotation;
        }
    }
    

      这是原文章地址:http://game.ceeger.com/forum/read.php?tid=1171&fid=2&page=1

  • 相关阅读:
    注意力机制在CV领域的应用之SEnet
    知识蒸馏技术原理
    batchsize如何影响模型的性能
    docker网络 macvlan
    docker pull使用 代理
    auditd重启失败
    3.Golang的包导入
    2.golang应用目录结构和GOPATH概念
    使用git版本管理时的免密问题
    1.go语言目录结构
  • 原文地址:https://www.cnblogs.com/Kprogram/p/4044806.html
Copyright © 2011-2022 走看看