学习目标:
最近学习过程经常遇到一些好的方法属性和技巧,但是很容易忘记,单内容都比较少,又不至于开一篇文章单独讲解各个用法,特此单独写一篇做汇总,好记性不如烂笔头,后面收获一些新的知识我还会
持续更新
这篇文章的
移动:
# 让游戏对象在两个点之间按照固定速度进行平滑的移动
# 参数1表示当前位置,参数2表示目标位置,参数3表示单次调用时最大移动距离
transform.position = Vector2.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime);
# 使游戏对象平滑地移动到一个新的位置
# rb.position:获取刚体当前的位置
# movement:表示游戏对象的移动方向,是一个Vector3类型的变量
# 这个方法必须在FixedUpdate中调用,必须带有刚体,以保证物理引擎的正确协同工作
rb.MovePosition(rb.position + movement * moveSpeed * Time.deltaTime);
# 代码改变了刚体的速度(velocity)属性
# 这个方法必须在FixedUpdate中调用,必须带有刚体,以保证物理引擎的正确协同工作
rb.velocity = new Vector3(moveH, moveV, moveZ);
力:
# 给刚体施加一个向上的力
//rb.AddForce(new Vector2(0, jumpForce));
rb.AddForce(Vector2.up * jumpForce);rb.AddForce(Vector2.up * jumpForce, ForceMode.Force);
常见的ForceMode包括:
ForceMode.Force:添加一个可持续力到刚体,使用
它的质量(默认)
ForceMode.Acceleration:添加一个可持续加速度到刚体,忽略
它的质量
ForceMode.Impulse:添加一个瞬间的冲击力到刚体,使用
它的质量
ForceMode.VelocityChange:添加一个瞬间的加速度给刚体,忽略
它的质量
翻转:
# 缺点:如果角色带有子物体,比如武器,不会跟着一起翻转
sp = GetComponent<SpriteRenderer>();
sp.flipX = true;
transform.localScale = new Vector3(-1, 1, 1);
transform.eulerAngles = new Vector3(0, 180, 0);
单例模式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameManager : MonoBehaviour
{public static GameManager instance;private void Awake();{if(instance =null){instance = this;}else{if(instance != this){Destroy(gameobject);}}DontDestroyOnLoad(gameobject);}
}
在Awake方法总,如果GameGameManager为空,那么我们就将这个脚本通过关键字【this
】赋值给变量instance
在else语句中,如果instance不为空,那么instance并非当前的脚本,那么就需要销毁当前的游戏对象,来保证脚本的唯一性
最后别忘了在方法的最后,通过DontDestroyOnLoad
方法,保证即使多个场景之间的互相切换也会保留这个脚本,保证在【不同场景
】中的唯一性
取绝对值
Mathf.Abs(-10); //输出10
检测鼠标
UI事件系统的接口
public void OnPointerEnter(PointerEventData eventData){// 鼠标移入时执行的操作
}public void OnPointerExit(PointerEventData eventData){// 鼠标移出时执行的操作
}
如果是物体,并非UI就需要使用鼠标事件来实现了,注意物体必须要有Collider组件
public void OnMouseEnter(PointerEventData eventData){// 鼠标移入时执行的操作
}public void OnMouseExit(PointerEventData eventData){// 鼠标移出时执行的操作
}
旋转
# 每帧绕X轴旋转1度
transform.Rotate(Vector3.right, 1f);# 每帧绕z轴绕指定点旋转1度
transform.RotateAround(centerPosition, Vector3.forward, 1f);# 每帧绕全局坐标系下的Y轴旋转1度
transform.rotation *= Quaternion.Euler(0f, 1f, 0f);# 每帧绕本地坐标系下的Y轴旋转1度
transform.rotation *= Quaternion.AngleAxis(1f, Vector3.up);# 每帧将物体从“fromDirection”的方向旋转到“toDirection”的方向
transform.rotation = Quaternion.FromToRotation(fromDirection, toDirection);
取整
# 向上取整
Mathf.CeilToInt(1.1f); //输出2# 向下取整
Mathf.FloorToInt(1.1f); //输出1# 四舍五入
Mathf.Round(3.1415926f); //输出3# 保留两位小数
float num = 3.149f;
float result = Math.Floor(num * 100f) / 100f; //输出3.14# 四舍五入保留两位小数
float res = (float)Math.Round(num, 2); //输出3.15
string res = num.ToString("F2"); //输出3.15
string res = num.ToString("0.00"); //输出3.15# 不够补0
float num = 3.1f;
string numStr = num.ToString("0.00"); //输出3.10
窗口显示类
没有继承MonoBehaviour的脚本默认在窗口是不可编辑的,需要增加System.Serializable
关键字