zoukankan      html  css  js  c++  java
  • unity3d模仿魔兽世界鼠标对游戏操作

      1、新建unity3d项目,在项目中导入CharacterController包。在游戏中创建Plane作为地面,把Plane的Tag设为Ground。创建Directional light照亮游戏世界。把第三人称控制器放到Plane上面,之后把挂载第三人称的脚本Remove掉,把它的Tag设为Player。

      2、创建LookTargetPos脚本,把它挂载到第三人称控制器上。它的作用是当鼠标左键按下且按下的位置为Plane时,第三人称控制器朝向鼠标按下方向。

    using UnityEngine;
    using System.Collections;
    
    public class LookTargetPos : MonoBehaviour
    {
    
    
        public static Vector3 targetPos;//用来保存鼠标点击到地面的位置
        private bool isMouseDown = false;//判断鼠标左键是否一直按下
        void Start()
        {
            targetPos = this.transform.position;
        }
        // Update is called once per frame
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                isMouseDown = true;
                LookAtPos();
            }
            else if (Input.GetMouseButtonUp(0))
            {
                isMouseDown = false;
            }
            //如果鼠标左键一直按下,则一直更新鼠标位置
            if (isMouseDown == true)
            {
                LookAtPos();
            }
        }
    
        void LookAtPos()
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitinfo;
            bool isCollider = Physics.Raycast(ray, out hitinfo);
            //判断鼠标是否点击地面
            if (isCollider == true && hitinfo.collider.tag == "Ground")
            {
                targetPos = hitinfo.point;
                targetPos.y = this.transform.position.y;
                this.transform.LookAt(targetPos);
            }
        }
    }

      3、创建PlayerMove脚本,把它挂载到第三人称控制器上。它的作用是控制第三人称控制器移动到鼠标左键按下的位置。

    using UnityEngine;
    using System.Collections;
    
    public enum Playerstate
    {
        Moveing,
        Idle
    }
    public class PlayerMove : MonoBehaviour
    {
    
        private CharacterController controller;
        public int speed = 4;
        private float distance;//用来保存游戏主角和目标点的距离
        public Playerstate state;//保存游戏主角的状态
        // Use this for initialization
        void Start()
        {
            controller = this.GetComponent<CharacterController>();
            state = Playerstate.Idle;
        }
    
        // Update is called once per frame
        void Update()
        {
            Move();
        }
        void Move()
        {
            distance = Vector3.Distance(this.transform.position, LookTargetPos.targetPos);
            if(distance>0.05f)
            {
                controller.SimpleMove(this.transform.forward * speed);
                state = Playerstate.Moveing;
                print(distance);
            }
            else
            {
                state = Playerstate.Idle;
            }
        }
    }

      4、创建PlayerState脚本,把它挂载到第三人称控制器上。它的作用是控制第三人称控制器动画播放。

    using UnityEngine;
    using System.Collections;
    
    public class PlayerState : MonoBehaviour
    {
    
        private PlayerMove playerState;
        private float distance;
        // Use this for initialization
        void Start()
        {
            playerState = this.GetComponent<PlayerMove>();
        }
    
        // Update is called once per frame
        void LateUpdate()
        {
            //如果游戏主角在移动就播放跑的动画
            if (playerState.state == Playerstate.Moveing)
            {
                PlayAnimation("run");
            }
            //如果游戏主角在等待就播放站的动画
            else if (playerState.state == Playerstate.Idle)
            {
                PlayAnimation("idle");
            }
        }
        void PlayAnimation(string animationName)
        {
            animation.CrossFade(animationName);
        }
    }

      5、创建CameraFollow脚本,把它挂载到Main Camera上。它的作用是:1、让Main Camera跟随第三人称控制器移动;2、改变Main Camera视角;3、控制Main Camera与第三人称控制器的距离。

    using UnityEngine;
    using System.Collections;
    
    public class CameraFollow : MonoBehaviour
    {
        private Vector3 followPos;//用来保存摄像机和游戏主角的相对位置
        private GameObject player;
        public float scrollSpeed = 10;//摄像机拉近的速度
        private bool isRotating = false;//判断鼠标右键是否按下
        public float rotateSpeed = 2;//摄像机左右旋转的速度
        private float distance;//保存摄像机和游戏主角距离
        // Use this for initialization
        void Start()
        {
            player = GameObject.FindGameObjectWithTag("Player");
            followPos = player.transform.position - this.transform.position;
            this.transform.LookAt(player.transform.position);
        }
    
        // Update is called once per frame
        void Update()
        {
            Follow();
            RotateView();
            ScrollView();
        }
        //使摄像机跟随游戏主角运动
        void Follow()
        {
            this.transform.position = player.transform.position - followPos;
        }
        //滑动鼠标滑轮的时候可以改变摄像机与游戏主角的距离
        void ScrollView()
        {
            distance = followPos.magnitude;
            distance += Input.GetAxis("Mouse ScrollWheel");
            distance=Mathf.Clamp(distance,2,18);
            followPos = followPos.normalized * distance;
        }
        //按下鼠标右键的时候移动鼠标可以改变摄像机的视角
        void RotateView()
        {
            if(Input.GetMouseButtonDown(1))
            {
                isRotating = true;
            }
            else if(Input.GetMouseButtonUp(1))
            {
                isRotating = false;
            }
            if(isRotating)
            {
                this.transform.RotateAround(player.transform.position, player.transform.up, rotateSpeed * Input.GetAxis("Mouse X"));
                Vector3 originalPos = this.transform.position;
                Quaternion originalRotation = this.transform.rotation;
                this.transform.RotateAround(player.transform.position, this.transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));
                float x = this.transform.eulerAngles.x;
                print(x);
                //限制摄像机旋转的最大,最小位置
                if(x<10||x>70)
                {
                    this.transform.position = originalPos;
                    this.transform.rotation = originalRotation;
                }
            }
            followPos = player.transform.position - this.transform.position;
        }
    }

      6、完成以后的效果,录屏鼠标看不见了,抱歉了。

     

  • 相关阅读:
    微软Silverlight 2.0 最新版本GDR发布
    POJ 2635, The Embarrassed Cryptographer
    POJ 3122, Pie
    POJ 1942, Paths on a Grid
    POJ 1019, Number Sequence
    POJ 3258, River Hopscotch
    POJ 3292, Semiprime Hnumbers
    POJ 2115, C Looooops
    POJ 1905, Expanding Rods
    POJ 3273, Monthly Expense
  • 原文地址:https://www.cnblogs.com/jj391/p/4820946.html
Copyright © 2011-2022 走看看