• unity3d学习笔记(一) 第一人称视角实现和倒计时实现


    unity3d学习笔记(一) 第一人称视角实现和倒计时实现

    1. 第一人称视角

    (1)让mainCamera和player(视角对象)同步在一起

    因为我们的player是生成的,所以不能把mainCamera直接放到预支对象里,所以我们实现的方法就是让player和camera的相对位置不变

    创建脚本 CameraFlow.cs用于控制mainCamera移动,把此脚本挂到mainCamera中, 同时设置mainCamera为刚体,重力为零(不然mainCamera会掉), 而且把mainCamera和人物的头部放在一起(这里可以点击暂停,然后慢慢调整mainCamera位置)

    下一步就是利用CameraFlow.cs使得mainCamera和人物相对位置不变

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CameraFlow : MonoBehaviour
    {
        public GameObject follow;            //跟随的物体
        public float smothing = 5f;          //相机跟随的速度
        Vector3 offset;                      //相机与物体相对偏移位置
    
        void Start()
        {
    
            offset = new Vector3(0,1.9f,0.15f);
    
    
        }
    
        void FixedUpdate()
        {
            Vector3 target = follow.transform.position + offset;
            //摄像机自身位置到目标位置平滑过渡
            //transform.position = Vector3.Lerp(transform.position, target, smothing * Time.deltaTime);
            this.transform.position = target;
        }
    }
    
    
    

    (2)使鼠标控制方向

    在mainCamera挂载mouseLook.cs脚本

    using UnityEngine;
    using System.Collections;
    
    public class mouseLook : MonoBehaviour
    {
        private IUserAction action;
        //方向灵敏度  
        public float sensitivityX = 0F;
        public float sensitivityY =0F;
        public float sensitive = 0.5f;
    
        //上下最大视角(Y视角)  
        public float minimumY = -60F;
        public float maximumY = 60F;
    
        float rotationY = 0F;
    
        void Update()
        {
            //根据鼠标移动的快慢(增量), 获得相机左右旋转的角度(处理X)  
            float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
    
            //根据鼠标移动的快慢(增量), 获得相机上下旋转的角度(处理Y)  
            rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
            //角度限制. rotationY小于min,返回min. 大于max,返回max. 否则返回value   
            rotationY = Mathf.Clamp(rotationY, minimumY, maximumY);
    
            //总体设置一下相机角度  
            transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
    
            action.rotation(new Vector3(-rotationY, rotationX , 0) );
            //旋转player
    
        }
    
        void Start()
        {
    
            action = SSDirector.GetInstance().CurrentScenceController as IUserAction;
            // Make the rigid body not change rotation  
            //if (rigidbody)
            //    rigidbody.freezeRotation = true;
        }
    }
    
    

    这样就实现了第一人称, 同时你可以加入移动脚本

    2.倒计时系统实现

    首先加入一个定时器类Timer.cs

    “`
    public class Timer

    {

    bool _isTicking;//是否在计时中
    
    public float _currentTime;//当前时间
    
    public float _endTime;//结束时间
    
    public delegate void EventHander();
    
    
    
    public Timer(float second)
    
    {
    
        _currentTime = 0;
    
        _endTime = second;
    
    }
    
    /// <summary>
    
    /// 开始计时
    
    /// </summary>
    
    public void StartTimer()
    
    {
    
        _isTicking = true;
    
    }
    
    /// <summary>
    
    /// 更新中
    
    /// </summary>
    
    public void UpdateTimer(float deltaTime)
    
    {
    
        if (_isTicking)
    
        {
    
            _currentTime += deltaTime;
    
            if (_currentTime > _endTime)
    
            {
    
                _isTicking = false;
    
    
            }
    
        }
    
    }
    
    /// <summary>
    
    /// 停止计时
    
    /// </summary>
    
    public void StopTimer()
    
    {
    
        _isTicking = false;
    
    }
    
    /// <summary>
    
    /// 持续计时
    
    /// </summary>
    
    public void ContinueTimer()
    
    {
    
        _isTicking = true;
    
    }
    
    /// <summary>
    
    /// 重新计时
    
    /// </summary>
    
    public void ReStartTimer()
    
    {
    
        _isTicking = true;
    
        _currentTime = 0;
    
    }
    
    /// <summary>
    
    /// 重新设定计时器
    
    /// </summary>
    
    public void ResetEndTimer(float second)
    
    {
    
        _endTime = second;
    
    }
    

    }
    “`

    然后就可以调用类 来进行倒计时处理了

    以下为测试代码

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class UserGUI : MonoBehaviour {
    
    
        private Timer time;
    
        void Start ()
        {
    
            time = new Timer(60);
            time.StartTimer();
    
        }
    
    
    
        void Update()
        {
    
            time.UpdateTimer(Time.deltaTime);
    
        }
        private void OnGUI()
        {
    
            GUI.Label(new Rect(10, Screen.height - 50, 200, 50), "倒计时:")
            GUI.Label(new Rect(75, Screen.height - 50, 200, 50), (time._endTime - time._currentTime).ToString(), score_style);
    
        }
    }
    
    
  • 相关阅读:
    软件工程概论课后作业2
    第三周进度表
    软件工程概论课后作业1
    第二周进度表
    9.异常处理
    《构建之法》阅读笔记二
    《构建之法》阅读笔记一
    第五周进度表
    软件工程个人作业03
    第四周进度表
  • 原文地址:https://www.cnblogs.com/qq874455953/p/9589216.html
Copyright © 2020-2023  润新知