• 塔防游戏的相机


    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    
    public class Cameracontroller : MonoBehaviour {
    
        public float mouseSpeed=0.05f;
        public float rotateSpeed=100;
        public float scrollwheelSpeed=200;
        public float moveSpeed=0.1f;
        public float lerpSpeed = 0.5f;
        public float lookSpeed=6;
        Vector3 mousePos;
        public static Action<GameObject> selectTower;
        public static Action<GameObject> exitSelectTower;
        [HideInInspector]
        public GameObject currSelectObj;
    
        void LateUpdate() {
    
            MoveRotation();
            DragMove();
            ScrollMove();
            CheckTower();
            MoveToTower();
            RotateToTower();
        }
        /// <summary>
        /// 鼠标右键控制移动旋转
        /// </summary>
        private void MoveRotation()
        {
            if (Input.GetKeyDown(KeyCode.Mouse1))
            {
                ResetTower();
            }
            if (Input.GetKey(KeyCode.Mouse1))
            {
                float mouseX = Input.GetAxis("Mouse X");
                float mouseY = Input.GetAxis("Mouse Y");
                transform.Rotate(Vector3.up, Time.deltaTime * mouseX * rotateSpeed, Space.World);
                transform.Rotate(transform.right, -Time.deltaTime * mouseY * rotateSpeed, Space.World);
                Vector2 input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
                Vector3 ms = new Vector3(input.x, 0, input.y) * moveSpeed;
                transform.Translate(ms, Space.Self);
            }
        }
        /// <summary>
        /// 拖拽中键移动
        /// </summary>
        private void DragMove()
        {
            if (Input.GetKeyDown(KeyCode.Mouse2))
            {
                ResetTower();
                mousePos = Input.mousePosition;
            }
    
    
            if (Input.GetKey(KeyCode.Mouse2))
            {
                Vector3 deltPos = Input.mousePosition - mousePos;
                deltPos = -deltPos;
                transform.Translate(deltPos * 0.1f, Space.Self);
                mousePos = Input.mousePosition;
            }
    
        }
        /// <summary>
        /// 滚动中键移动
        /// </summary>
        private void ScrollMove()
        {
            float scrollwhell = Input.GetAxis("Mouse ScrollWheel");
            transform.Translate(Vector3.forward * Time.deltaTime * scrollwhell * scrollwheelSpeed);
           
        }
        /// <summary>
        /// 选择塔
        /// </summary>
        private void CheckTower()
        {
    
            RaycastHit hit = default(RaycastHit);
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 1000))
            {
                if (Input.GetKeyUp(KeyCode.Mouse0))
                {
                    if (hit.collider.tag == "TowerBase")
                    {
                        currSelectObj = hit.collider.gameObject;
                        if (selectTower != null)
                        {
                            selectTower(currSelectObj);
    
                        }
                        toMove = true;
                        toRot = true;
                    }
                }
                
            }
        }
        /// <summary>
        /// 移动到塔
        /// </summary>
        bool toMove = false;
        private void MoveToTower()
        {
            if (!toMove)
                return;
            transform.position = Vector3.Lerp(transform.position, currSelectObj.transform.position, Time.deltaTime* lerpSpeed);
            if (Vector3.Distance(currSelectObj.transform.position, transform.position)<10)
                toMove = false;
        }
        /// <summary>
        /// 选择向塔
        /// </summary>
        bool toRot = false;
        private void RotateToTower()
        {
            if (!toRot)
                return;
            Quaternion lookAt = Quaternion.LookRotation((currSelectObj.transform.position - transform.position).normalized);
            transform.rotation = Quaternion.Lerp(transform.rotation, lookAt, Time.deltaTime * lerpSpeed * 6);
            float angle = Quaternion.Angle(transform.rotation, lookAt);
            if (angle<1)
                toRot = false;
        }
        /// <summary>
        /// 设置选择塔为null
        /// </summary>
        /// <param name="go"></param>
        public void ResetTower()
        {
            if (exitSelectTower != null)
               exitSelectTower(currSelectObj);
    
            currSelectObj = null;
        }
    }
  • 相关阅读:
    JAVA 不同类载入器命名空间的理解
    着手微信企业号的一些尝试
    redis之字符串命令源代码解析(二)
    设计模式学习04—建造者模式
    联合体union用在何处?
    10款jQuery/CSS3动画应用 超有用
    JavaWeb学习笔记:Tomcat
    Directx9.0 学习教程3 -图形学之创建点 线 三角形 等
    hdu 1158 Employment Planning (dp)
    (九十二)加速计的使用方法(过期方法+新方法)
  • 原文地址:https://www.cnblogs.com/DazeJiang/p/14564664.html
Copyright © 2020-2023  润新知