zoukankan      html  css  js  c++  java
  • Unity3d 札记-Tanks Tutorial 知识点汇总---控制物体移动+动态调整摄像机位置和视野

    1如何通过输入来控制物体的移动

                   前提:物体必须添加RigidBody(刚体)组件

         1.初始化 组件

         选择在Awake()或者Start()方法中RigidBody rb = GetComponent<RigidBody>();

         2.获得输入

         在 void Update()方法中写入 获取代码

       

    private float m_InputVerticalValue;
    private float m_InputHorizontalValue;
    void Update(){
         m_InputVerticalValue = Input.GetAxis("Vertical");
         //Input.GetAxis(String AxisName),默认正向为1,负向为 -1 ,不动为 0 
         m_InputHorizontalValue = Input.GetAxis("Horizontal");
    }

          3.在Update() 或者 FixedUpdate()中利用 得到的输入值  m_InputVerticalValue,m_InputHorizontalValue;

    //第一种RigidBody.AddForce()
    private float force  = 10;
    void Update(){
       ……
      rb.AddForce(force*m_InputVerticalValue*Time.deltaTime);
    
    }
    
    
    //另外一种 RigidBody.MovePosition() RigidBody.MoveRotation();
    private void FixedUpdate()
        {
            // Move and turn the tank.
    		Move();
    		Turn();
        }
    
    
        private void Move()
        {
            // Adjust the position of the tank based on the player's input.
    		Vector3 movement = transform.forward*m_Speed*m_MovementInputValue*Time.deltaTime;
    		m_Rigidbody.MovePosition (transform.position + movement);
        }
    
    
        private void Turn()
        {
    		float turn = m_TurnSpeed * m_TurnInputValue * Time.deltaTime;
            // Adjust the rotation of the tank based on the player's input.
    		Quaternion turnQuaternion  =  Quaternion.Euler(0f,turn,0f);
    		m_Rigidbody.MoveRotation (transform.rotation * turnQuaternion);
        }
    

    2Camera如何随着坦克移动,调整位置及视野?              Position            Zoom

               解决方案 :   通过各个坦克的三维位置 计算得出平均位置 

                                 通过找到各个坦克 离平均位置的 距离         得到视野的大小

     

    using UnityEngine;
    
    public class CameraControl : MonoBehaviour
    {
        public float m_DampTime = 0.2f;                 
        public float m_ScreenEdgeBuffer = 4f;           
        public float m_MinSize = 6.5f;                  
        public Transform[] m_Targets; 
    
    
        private Camera m_Camera;                        
        private float m_ZoomSpeed;                      
        private Vector3 m_MoveVelocity;                 
        private Vector3 m_DesiredPosition;              
    
    
        private void Awake()
        {
            m_Camera = GetComponentInChildren<Camera>();
        }
    
    
        private void FixedUpdate()
        {
            Move();
            Zoom();
        }
    
    
        private void Move()
        {
            FindAveragePosition();
    
            transform.position = Vector3.SmoothDamp(transform.position, m_DesiredPosition, ref m_MoveVelocity, m_DampTime);
        }
    
    
        private void FindAveragePosition()
        {
            Vector3 averagePos = new Vector3();
            int numTargets = 0;
    
            for (int i = 0; i < m_Targets.Length; i++)
            {
                if (!m_Targets[i].gameObject.activeSelf)
                    continue;
    
                averagePos += m_Targets[i].position;
                numTargets++;
            }
    
            if (numTargets > 0)
                averagePos /= numTargets;
    
            averagePos.y = transform.position.y;
    
            m_DesiredPosition = averagePos;
        }
    
    
        private void Zoom()
        {
            float requiredSize = FindRequiredSize();
            m_Camera.orthographicSize = Mathf.SmoothDamp(m_Camera.orthographicSize, requiredSize, ref m_ZoomSpeed, m_DampTime);
    //SmoothDamp是一个渐变的过程
    //需要ref ZoomSpeed 和 m_DampTime来计算渐变过程
        }
    
    
        private float FindRequiredSize()
        {
            Vector3 desiredLocalPos = transform.InverseTransformPoint(m_DesiredPosition);
    
            float size = 0f;
    
            for (int i = 0; i < m_Targets.Length; i++)
            {
                if (!m_Targets[i].gameObject.activeSelf)
                    continue;
    
                Vector3 targetLocalPos = transform.InverseTransformPoint(m_Targets[i].position);
    //以当前视野为参考系,3维转2维
                Vector3 desiredPosToTarget = targetLocalPos - desiredLocalPos;
    //计算相对位置
                size = Mathf.Max (size, Mathf.Abs (desiredPosToTarget.y));
    //取最大Y方向距离
                size = Mathf.Max (size, Mathf.Abs (desiredPosToTarget.x) / m_Camera.aspect);
    //取最大的符合分辨率的距离
            }
            
            size += m_ScreenEdgeBuffer;
    
            size = Mathf.Max(size, m_MinSize);
    
            return size;
        }
    
    
        public void SetStartPositionAndSize() //直接调整位置和视野,不用渐变过程
        {
            FindAveragePosition();
    
            transform.position = m_DesiredPosition;
    
            m_Camera.orthographicSize = FindRequiredSize();
        }
    }
  • 相关阅读:
    Machine Learning Basic Knowledge
    What is the reason that a likelihood function is not a pdf?
    MySql 增加字段 删除字段 修改字段名称 修改字段类型
    Manual install on Windows 7 with Apache and MySQL
    linux 解压命令大全[转]
    MVC2项目实践
    JSP显示新闻
    servlet应用
    login登录页面
    java web基础
  • 原文地址:https://www.cnblogs.com/dongfangliu/p/5796533.html
Copyright © 2011-2022 走看看