游戏制作之路(13)限制眼睛上下转动的范围
通过前面介绍,已经实现第三人称的角色控制,但有一个问题,当你上下地查看时,可以把整个场景翻转过来,如下图:
这种场景,往往我们是不希望出现的,毕竟不是在开飞机。那么怎么办呢?这时,我们就要想办法了,控制头的旋转角度,不要让它360度地旋转了。如果我们要限制在-80到80度之间,那么怎么样来实现呢?估计你首先会想到使用if语句来判断,其实可以使用Mathf.Clamp函数实现同样的功能。可以查看到这个函数定义如下:
public static float Clamp(float value, float min, float max);
限制value的值在min和max之间, 如果value小于min,返回min。 如果value大于max,返回max,否则返回value。
通过此函数的了解,因此,我们只需要把将要改变的旋转值放到第一个参数,后面两个参数分别设置最小值和最大值,就可以限制旋转的角度了。因而,我们需要脚本文件BasicMovement.cs里定义一个变量来跟踪头的旋转角度,如下:
private float currentHeadRotation = 0;
可以看这行代码采用private为定义,也就是说这个变量只能在本类使用,别的地方不能操作。同时,private声明的变量不会在inspector里查看到,不能在里面修改。因而很多私有的数据,都要来定义为private,这样防止别的类乱修改,或者界面上作修改。为了修改方便,我们同样定义两个公共属性的最小值和最大值变量,如下:
public float maxHeadRotation = 80.0f;
public float minHeadRotation = -80.0f;
这时,万事俱备只欠东风,要开始使用函数Mathf.Clamp了,因此,整个代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BasicMovement : MonoBehaviour {
public float speed = 10.0f;
public float rotationSpeed = 2.0f;
public Transform head;
public float maxHeadRotation = 80.0f;
public float minHeadRotation = -80.0f;
private float currentHeadRotation = 0;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
//transform.position += input * speed * Time.deltaTime;
//gameObject.GetComponent<CharacterController>().Move(input * speed * Time.deltaTime);
gameObject.GetComponent<CharacterController>().Move(transform.TransformDirection(input * speed * Time.deltaTime));
Vector2 mouseInput = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
transform.Rotate(Vector3.up, mouseInput.x * rotationSpeed);
//Debug.Log(mouseInput.x + ":" + mouseInput.y);
//head.Rotate(Vector3.left, mouseInput.y * rotationSpeed);
currentHeadRotation = Mathf.Clamp(currentHeadRotation + mouseInput.y * rotationSpeed, minHeadRotation, maxHeadRotation);
head.localRotation = Quaternion.identity;
head.Rotate(Vector3.left, currentHeadRotation);
}
}
对比旋转的代码,可以看到,当前角度currentHeadRotation加上鼠标变化的值,如果在范围内,就返回相应的值,如果不在,就返回边界值。然后设置head的旋转位置为Quaternion.identity,这是什么意思呢?Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值。transform.localRotation属性一般使用四元数赋值,通过Quaternion可以将欧拉角转化为四元数,表示当前旋转角度。因此,这段代码的意思,就是每次head要旋转之前,先复位,再进行旋转。旋转还是调用函数head.Rotate来实现的。如果不进行复位的动作,会发现后一个旋转是前一个旋转基础之上进行的。
经过这样的修改,你再尝试play这个游戏,可以看到不会再颠倒场景了。增加的变量如下图显示:
如果你想限制其它角度值,就可修改80到-80之间的值。
Python游戏开发入门
http://edu.csdn.net/course/detail/5690
你也能动手修改C编译器
http://edu.csdn.net/course/detail/5582
纸牌游戏开发
http://edu.csdn.net/course/detail/5538
相关文章
- 利用不相交集类制作迷宫游戏(数据结构课程设计——迷宫老鼠)
- (NO.00005)iOS实现炸弹人游戏(三):从主场景类谈起
- Cocos2D:塔防游戏制作之旅(十五)
- (NO.00001)iOS游戏SpeedBoy Lite成形记(二十三)
- (NO.00001)iOS游戏SpeedBoy Lite成形记(十八)
- 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
- 使用Cocos2d-x制作三消类游戏Sushi Crush(第一部分)
- 简易2D横版RPG游戏制作
- C#基础视频教程7.1 如何编写简单游戏
- IDA修改游戏
- python 从一道作业题到制作一个图形界面的“诈金花”游戏
- 什么是游戏运维?
- 小恐龙快跑,不要被逮到拉~ python制作小恐龙游戏
- 聊聊游戏业务怎么用高斯Redis
- 制作单机俄罗斯方块游戏总结(一)
- 【Neo4j构建知识图谱】官方服务图谱大型数据集下载与可视化方法【数据集包括:食谱数据、足球、权力的游戏、美国宇航局、英国公司注册、财产所有权、政治捐款】
- Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)
- 分享2D Unity游戏的动画制作经验
- 3D游戏从入门到精通-8
- 游戏制作之路(61)使用UGUI的按钮动画
- 游戏制作之路(14)模拟子弹的制作
- 游戏制作之路(17)模拟子弹的杀伤力
- 游戏制作之路(11)实现眼睛上下转动
- 游戏制作之路(10)世界坐标空间
- 游戏制作之路(2)Blender设置界面中文显示
- 游戏制作之路(30)用代码显示文本
- 游戏制作之路(27)Camera(摄像机)的清除标志Don’t clear
- 游戏制作之路(24)Camera(摄像机)的清除标志Skybox
- 石头剪刀布游戏
- 【python游戏制作】快来跟愤怒的小鸟一起攻击肥猪们的堡垒吧
- 约瑟夫生者死者游戏 数据结构作业
- Python游戏开发入门-蔡军生-专题视频课程