Unity3D学习笔记(三):V3、运动、帧率、OnGUI
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LookGirl : MonoBehaviour {
GameObject girl;
// Use this for initialization
void Start () {
girl = GameObject.Find("Girl");
} // Update is called once per frame
void Update () {
//盯着看:盯住一个点
transform.LookAt(girl.transform.position);
//环绕旋转:point点,axis轴,angle每帧旋转角度
transform.RotateAround(girl.transform.position,Vector3.up,);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//可以在检视面板暴露枚举
public enum Sex
{
Man,
Woman
}
public class TurnPublic : MonoBehaviour {
//在检视面板暴露一个对象变量,让游戏物体可以拖拽赋值
public GameObject target;
//在检视面板暴露Transform组件
public Transform trans;
//检视面板可以暴露以下
public int level;
public float health;
public string path;
public bool canMove;
public Sex sex;
public int[] array;
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
transform.RotateAround(target.transform.position, target.transform.up, );
}
}
自转
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TurnSelf : MonoBehaviour {
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
transform.Rotate(transform.up);
}
}
Deg2Rad:角度转弧度(2是to的意思)* PI /
Rad2Deg:弧度转角度
Abs:绝对值
sin:正弦,Sin(/)=30度
cos:余弦
tan:正切
Asin:反正弦,Sin(/)=60度
Acos:反余弦
Atan:反正切
Ceil:向上取整数
Floor:向下取整数
Clamp:限值,Clamp(,),输入5.,返回5,(可以把坐标限值在一定范围内,防止越界)
Clamp01:
Lerp:线性插值
log:取对数
Movetowards:是插值的一种
Pow(float f , float p):f的p次方
Sqrt:开平方
PI:3.1415926
Max:最大值
Min:最小值
三角函数曲线
三角函数分镜
:9等比缩放
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputTest : MonoBehaviour
{
//拖拽资源文件夹里的
public Texture image;
int sum;
int curNum;
float h;
float v;
float mouse_h;
float mouse_v;
public float m_JumpSpeed = 400f;
private bool m_jumping = false;
private Rigidbody m_Rigidbody;
private Animator m_Anim;
private void Awake()
{
m_Anim = GetComponent<Animator>();
m_Rigidbody = GetComponent<Rigidbody>();
}
private bool jumped = true;
// Use this for initialization
void Start()
{ }
// Update is called once per frame
void Update()
{
//实时监听
//GetKey按住,GetKey.Down按下,GetKey.Up抬起,KeyCode键盘按键的枚举项
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back);
}
if (Input.GetKey(KeyCode.A))
{
transform.Rotate(Vector3.down);
}
if (Input.GetKey(KeyCode.D))
{
transform.Rotate(Vector3.up);
}
if (Input.GetMouseButtonDown())
{
Debug.Log("FUCK");
}
//轴值映射
//GetAxis获取轴值,显示轴值的变化(-1~1)
//水平:Horizontal
//垂直:Vertical
h = Input.GetAxis("Horizontal");
v = Input.GetAxis("Vertical");
//按帧移动,和电脑性能有关,帧速快的电脑,移动速快
transform.Translate(Vector3.forward * 0.1f * v);
transform.Rotate(Vector3.down * 1.0f * h);
if (transform.position.z <- || transform.position.z > )
{
transform.position += new Vector3(, , Mathf.Clamp(transform.position.z, -, ));
}
else
{
transform.Translate(Vector3.forward * 0.1f * v);
}
//鼠标有灵活度,根据快慢分等级,显示轴值的变化不是固定的
mouse_h = Input.GetAxis("Mouse X");
mouse_v = Input.GetAxis("Mouse Y");
//按秒移动,和电脑性能无关,把每帧多少米变成每秒多少米
//Time.deltaTime每帧刷新所需要的时间
//Time.time是Time.deltaTime的累加(从游戏开始到现在,大致经过的时间),
//Time.fixedDeltaTime是每一物理帧的时间间隔,固定值0.02s
transform.Translate(Vector3.forward * 0.1f * v);
transform.Rotate(Vector3.down * 1.0f * h);
//每秒走的路程 = 每帧走1米(速度) * 每帧消耗的时间1/60秒(时间)
transform.Translate(Vector3.forward * Time.deltaTime);
//用Mathf.Clamp函数限值坐标的取值范围
Clamp(float value, float min, float max);
Mathf.Clamp(transform.position.x, -, );
Mathf.Clamp(transform.position.z, -, );
#region 限值物体移动范围
#endregion
}
} //OnGUI商业已不用,现主要用于调试
void OnGUI()
{
//两种方式:自定义布局方式,自动排版方式
//自动排版方式
if (curNum <= )
{
sum += curNum;
curNum++;
}
GUILayout.Label("当前和:" + sum);
GUILayout.Button("FUCK");
GUILayout.Box(image);
GUILayout.Label("Horizontal:" + h);
GUILayout.Label("Vertical:" + v);
//GUILayout.Label("Mouse X:" + mouse_h);
//GUILayout.Label("Mouse Y:" + mouse_v);
GUILayout.Label("Time.deltaTime:" + Time.deltaTime);
GUILayout.Label("Time.time:" + Time.time);
GUILayout.Label("Time.fixedDeltaTime:" + Time.fixedDeltaTime);
if (GUILayout.Button("FUCK"))
{
//timeScale是时间缩放,时间变慢了1倍(变成原来的0.5倍),只能缩放Time.deltaTime
Time.timeScale = 0.5f;
}
}
复习
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// MonoBehaviour -> Behaviour -> Component -> Object
public class W05d4 : MonoBehaviour
{
public GameObject obj; // Cube
// Use this for initialization
void Start()
{
// 如何获取组件
// Component -> GetComponent
Camera cam = GetComponent<Camera>();
if (cam != null)
{
cam.depth = ;
}
// 如何添加组件
GameObject->AddComponent
// 先寻找Cube
Move cubeMove = obj.AddComponent<Move>(); // 返回值:添加的那个组件的对象引用
cubeMove.moveSpeed = 0.1f;
// 删除组件
// UnityEngine.Object -> Destroy
GameObject findObj = GameObject.Find("Player");
if (findObj != null)
{
// 把移动速度变成0.5
// 1 获取Move组件
Move cubeMove = findObj.GetComponent<Move>();
if (cubeMove != null)
{
// 2 改Move组件的变量
cubeMove.moveSpeed = 0.5f;
}
}
GameObject findObj = GameObject.Find("Player/Capsule/FirePos");
if (findObj) // findObj != null
{
Light light = findObj.AddComponent<Light>();
light.type = LightType.Spot;
}
}
// Update is called once per frame
void Update()
{
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
public Texture texture;
float h;
float v;
float hRaw;
float vRaw;
float mouseH;
float mouseV;
float mouseScrollWheel;
public float moveSpeed = 0.1f;
public float rotSpeed = 1f;
// Use this for initialization
void Start()
{
}
void Update()
{
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime * Input.GetAxisRaw("Vertical"));
transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime * Input.GetAxisRaw("Horizontal"));
}
// Update is called once per frame
void Update1()
{
// 按键输入
// 1、键盘的 键值
if (Input.GetKey(KeyCode.A)) // 按着A的时候 每帧都会检测到
{
}
if (Input.GetKeyDown(KeyCode.A)) // 按下A的那一帧 会检测到
{
}
if (Input.GetKeyUp(KeyCode.A)) // 抬起A的那一帧 会检测到
{
}
// 2、 轴值
// 按A、D 或者 方向键左、方向键右的时候会返回一个float值, 如果不按会返回0
// 会有一个渐变的过程 假设我按了A 这时返回值会从 0 逐渐变化到 -1
// D 0 1
// 受时间缩放影响的
h = Input.GetAxis("Horizontal");
v = Input.GetAxis("Vertical");
//不受时间缩放的影响
mouseH = Input.GetAxis("Mouse X");
mouseV = Input.GetAxis("Mouse Y");
mouseScrollWheel = Input.GetAxis("Mouse ScrollWheel");
//没有渐变的过程 按下A hRaw 变成了-1 按下D hRaw 变成了 1
hRaw = Input.GetAxisRaw("Horizontal");
vRaw = Input.GetAxisRaw("Vertical");
// 3、 功能键
if (Input.GetButtonDown("Jump"))
{
Debug.Log("功能键 Jump 被按下");
}
// 鼠标输入
// 0 左键 1 右键 2 中键
if (Input.GetMouseButtonDown())
{
Debug.Log("鼠标左键 被按下");
}
}
private void OnGUI()
{
GUI.Label(new Rect(, , , ), "Hello World");
if (GUI.Button(new Rect(, , , ), "Button"))
{
GameObject target = GameObject.Find("Target1");
if(target)
{
transform.LookAt(target.transform);
}
GameObject target2 = GameObject.Find("Target2");
if(target2)
{
target2.transform.LookAt(transform);
}
}
if(GUI.Button(new Rect(, , , ), texture))
{
}
GUI.Label(new Rect(, , , ), "Width :" + Screen.width);
GUI.Label(new Rect(, , , ), "Height :" + Screen.height);
//GUI.DrawTexture(new Rect(10, 10, 80, 80), texture);
//GUILayout.Label("H : " + h);
//GUILayout.Label("mouseH : " + mouseH);
//GUILayout.Label("mouseV : " + mouseV);
//GUILayout.Label("mouseScrollWheel : " + mouseScrollWheel);
//GUILayout.Label("hRaw : " + hRaw);
//GUILayout.Label("vRaw : " + vRaw);
//if (GUILayout.Button("TimeScale" + Time.timeScale))
//{
// Time.timeScale = 1 - Time.timeScale;
//}
}
}
练习题
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Question : MonoBehaviour
{
public GameObject objA;
public GameObject objB;
public const float TimeInterval = 0.5f; // 冷却时间
public float timeCount = ;
public float currentTime = ; // 记录当前的Time.time
#region Q1_如何注视
// 1、游戏物体A 注视 游戏物体B
// 2、当前脚本挂载的游戏物体 注视 游戏物体A
#endregion
#region Q2_如何围绕旋转
// 1、游戏物体A 围绕 游戏物体B 绕世界坐标系的 Y轴 旋转 --每秒旋转60度
// 2、游戏物体A 围绕 游戏物体B 的 Y轴 旋转
#endregion
#region Q3_响应键盘按键事件
// 操控 当前挂载脚本的 游戏物体
// 1、按下 数字键0 发射子弹(伪代码替代)
// 2、按下 空格键 跳跃(伪代码替代)
// 3、按下 W、S键 前后移动
// 4、使用轴值的方式控制物体 绕世界的Y轴 旋转
// 5、使用轴值的方式控制物体 绕自身的Y轴 旋转
// 6、使用鼠标的XY轴值控制物体的 俯仰角(绕X轴旋转的角度)、偏航角(绕Y轴旋转的角度) //注: 俯仰角、偏航角、滚转角 --欧拉角/姿态角
// 7、按下鼠标左键 发射子弹(伪代码替代)
// 8、通过鼠标滚轮 实现物体 前后移动(自身坐标系)
#endregion
#region Q4_Time类 OnGUI
// 1、按下鼠标右键可以发射子弹,子弹的发射间隔为 0.5秒
// 2、使用自动布局的方式绘制按钮,按钮被按下以后,可以暂停游戏
#endregion
#region Q5_Mathf类
// 1、求绝对值
// 2、开方
// 3、如何限制一个变量的取值范围
// 4、向上、向下取整
// 5、正弦、余弦函数
#endregion
void Start()
{
currentTime = Time.time;
}
void Update()
{
#region Q1_如何注视_Answer
// 1、游戏物体A 注视 游戏物体B
objA.transform.LookAt(objB.transform);
// 2、当前脚本挂载的游戏物体 注视 游戏物体A
transform.LookAt(objA.transform);
#endregion
#region Q2_如何围绕旋转_Answer
// 1、游戏物体A 围绕 游戏物体B 绕世界坐标系的 Y轴 旋转 每秒旋转60度
objA.transform.RotateAround(objB.transform.position, Vector3.up, * Time.deltaTime);
// 2、游戏物体A 围绕 游戏物体B 的 Y轴 旋转
// objB.transform.up 物体自身的Y轴 在世界坐标系中的 向量
objA.transform.RotateAround(objB.transform.position, objB.transform.up, * Time.deltaTime);
#endregion
#region Q3_响应键盘按键事件_Answer
// 1、按下 数字键0 发射子弹(伪代码替代)
if (Input.GetKeyDown(KeyCode.Alpha0))
{
// 发射子弹
}
// 2、按下 空格键 跳跃(伪代码替代)
if (Input.GetKeyDown(KeyCode.Space))
{
// 跳跃
}
// 3、按下 W、S键 前后移动
if (Input.GetKey(KeyCode.W))
{
transform.Translate(Vector3.forward * * Time.deltaTime, Space.Self); // 往自身的前方
transform.Translate(transform.forward * * Time.deltaTime, Space.World); // 往自身的前方
transform.Translate(Vector3.forward * * Time.deltaTime, Space.World); // 往世界的前方
}
else if (Input.GetKey(KeyCode.S))
{
transform.Translate(Vector3.back * * Time.deltaTime);
}
// 4、使用轴值的方式控制物体 绕世界的Y轴 旋转
float h = Input.GetAxis("Horizontal");
transform.Rotate(Vector3.up * * Time.deltaTime * h, Space.World); // 世界
// 5、使用轴值的方式控制物体 绕自身的Y轴 旋转
transform.Rotate(Vector3.up * * Time.deltaTime * h, Space.Self); // 自身 第2个参数不指定,默认 Space.Self
// 6、使用鼠标的XY轴值控制物体的 俯仰角(绕X轴旋转的角度)、偏航角(绕Y轴旋转的角度) //注: 俯仰角、偏航角、滚转角 --欧拉角/姿态角
float mouseX = Input.GetAxis("Mouse X"); // 偏航角
float mouseY = Input.GetAxis("Mouse Y");
Vector3 eu = transform.eulerAngles;
eu.y += mouseX;
eu.x += mouseY;
transform.eulerAngles = eu;
// 7、按下鼠标左键 发射子弹(伪代码替代)
if (Input.GetMouseButtonDown())
{
// 发射子弹
}
// 8、通过鼠标滚轮 实现物体 前后移动(自身坐标系)
float msw = Input.GetAxis("Mouse ScrollWheel");
transform.Translate(Vector3.forward * * Time.deltaTime * msw);
#endregion
#region Q4_Time类 OnGUI_Answer
// 1、按下鼠标右键可以发射子弹(伪代码),子弹的发射间隔为 0.5秒
timeCount += Time.deltaTime;
if (timeCount >= TimeInterval)
{
if (Input.GetMouseButtonDown())
{
// 发射子弹
// 重置时间
timeCount = ;
}
}
if (Time.time - currentTime >= TimeInterval)
{
// 发射子弹
if (Input.GetMouseButtonDown())
{
// 发射子弹
// 重置时间
currentTime = Time.time;
}
}
// 2、使用自动布局的方式绘制按钮,按钮被按下以后,可以暂停游戏
#endregion
#region Q5_Mathf类_Answer
// 1、求绝对值
float num1 = -10.2f;
//num1 = Mathf.Abs(num1);
// 2、开方
//num1 = Mathf.Sqrt(num1);
// 3、如何限制一个变量的取值范围
num1 = Mathf.Clamp(num1, , );
// 4、向上、向下取整
num1 = Mathf.Ceil(num1); // 向上取整 -10
num1 = Mathf.Floor(num1); // 向下取整 -11
// 5、正弦、余弦函数
num1 = Mathf.Sin(num1);
num1 = Mathf.Cos(num1);
#endregion
}
private void OnGUI()
{
// 2、使用自动布局的方式绘制按钮,按钮被按下以后,可以暂停游戏
if (GUILayout.Button("暂停游戏"))
{
Time.timeScale = ;
}
}
}
Unity3D学习笔记(三):V3、运动、帧率、OnGUI的更多相关文章
- unity3d学习笔记(一) 第一人称视角实现和倒计时实现
unity3d学习笔记(一) 第一人称视角实现和倒计时实现 1. 第一人称视角 (1)让mainCamera和player(视角对象)同步在一起 因为我们的player是生成的,所以不能把mainCa ...
- Unity3D学习笔记2——绘制一个带纹理的面
目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...
- Unity3D学习笔记3——Unity Shader的初步使用
目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
随机推荐
- PHP开发接口使用RSA进行加密解密方法
网络安全问题很重要,尤其是保证数据安全,遇到很多在写接口的程序员直接都是明文数据传输,在我看来这是很不专业的.本人提倡经过接口的数据都要进行加密解密之后进行使用. 这篇文章主要介绍使用PHP开发接口, ...
- Scala系统学习(五):Scala访问修辞符
本章将介绍Scala访问修饰符.包,类或对象的成员可以使用私有(private)和受保护(protected)的访问修饰符进行标注,如果不使用这两个关键字的其中一个,那么访问将被视为公开(public ...
- ssh 远程执行命令
SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进 ...
- Locust性能测试5-参数化批量注册
前言 实现场景:所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复. 例如,模拟10用户并发注册账号,总共有100个手机号,要求注册账号不重复,注册完毕后结束测试 准备数据 虚拟用户 ...
- python 安装 Scrapy 模块
环境的安装总是让人多愁善感,爱恨交叉... 本人安装环境:win7 64 + python2.7 先来几个网站 https://doc.scrapy.org/en/latest/intro/insta ...
- try except else
try except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后.这个子句将在try子句没有发生任何异常的时候执行.例如: for arg in sys. ...
- 持续集成之四:Jenkins+sonarqube
参考其他文章,编译 构建 检查工具 参考:https://blog.csdn.net/lswnew/article/details/79193529 http://www.uml.org.cn/cod ...
- FastDFS单节点安装 & FastDFS+Nginx整合
安装环境 FastDFS_v5.05.tar.gz(http://sourceforge.net/projects/fastdfs/files/) fastdfs-nginx-module ...
- 2018-2019-2 20165209 《网络对抗技术》Exp2:后门原理与实践
2018-2019-2 20165209 <网络对抗技术>Exp2:后门原理与实践 1 后门原理与实验内容 1.1 后门原理 -后门就是不经过正常认证流程而访问系统的通道. 哪里有后门呢? ...
- 微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击
微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击 摘要: 小程序和公众号最大的区别有如下四点:1.小程序没有粉丝,开发者在后台能看到的只能是累计用户访问数以及实时统计 ...