Mathf
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class lesson1 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
#region Mathf和Math
//Math是C#中封装好的用于数学计算的工具类——位于system命名空间中
//Mathf是Unity中封装好的用于数学计算的工具结构体——位于UnityEngine命名空间中
//他们都是提供来用于进行数学相关计算的
#endregion
#region 他们的区别
//Mathf 和 Math中的相关方法几乎一样
//Math 是C#自带的工具类 主要就是提供一些数学相关的计算方法
//Mathf 是Unity专门封装的,不仅包含Math中的方法,还多了一些适用于游戏开发的方法
//所以我们在进行unity游戏开发时
//使用Mathf中的方法用于数学计算即可
#endregion
#region Mathf中的常用方法——一般计算一次
//1.Π-PI
print(Mathf.PI);
//2.取绝对值-Abs
print(Mathf.Abs(-10));
print(Mathf.Abs(-20));
print(Mathf.Abs(1));
//3.向上取整-CeilToInt
float f = 1.3f;
int i = (int)f;
print(i);
print(Mathf.CeilToInt(f));
//4.向下取整-FloorToInt
print(Mathf.FloorToInt(9.6F));
//5.钳制函数-Clamp
print(Mathf.Clamp(10, 11, 20));//11 比最小还小取最小
print(Mathf.Clamp(21, 11, 20));//20 比最大还大取最大
print(Mathf.Clamp(15, 11, 20));//15 在两者之前取本身
//6.获取最大值-Max
print(Mathf.Max(1, 2, 3, 4, 5, 6, 7, 8));
//7.获取最小值-Min
print(Mathf.Min(1, 2, 3, 4, 5, 6, 7, 8));
//8.一个数的n次幂-Pow
print("一个数的n次方" + Mathf.Pow(4, 2));//16
print("一个数的n次方" + Mathf.Pow(2,3));//8
//9.四舍五入-RoundToInt
print("四舍五入" + Mathf.RoundToInt(1.3f));//1
print("四舍五入" + Mathf.RoundToInt(1.5f));//2
//10.返回一个数的平方根-Sqrt
print("返回一个数的平方根"+Mathf.Sqrt(4));//2
print("返回一个数的平方根"+Mathf.Sqrt(16));//4
print("返回一个数的平方根"+Mathf.Sqrt(64));//8
//11.判断一个数是否是2的n次方-IsPowerOfTow
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(4));//true
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(8));//true
print("判断一个数是否是2的n次方" + Mathf.IsPowerOfTwo(3));//false
//12.判断正负数-Sign
print("判断正负数" + Mathf.Sign(0));//1
print("判断正负数" + Mathf.Sign(10));//1
print("判断正负数" + Mathf.Sign(-10));//-1
#endregion
}
float start=0;
float result=0;
float time = 0;
// Update is called once per frame
void Update()
{
#region Mathf中的常用方法——一般不停计算
//插值运算-Lerp
//Lerp函数公式
//result = Mathf。Lerp(start,end,t);
//t为插值系数,取值范围为0~1
//result = start + (end-start)*t
//插值运算用法一
//每帧改变start的值——变化先快后慢,位置无限接近,但是不会得到end位置
start = Mathf.Lerp(start, 10, Time.deltaTime);
//插值运算用法二
//每帧改变t的值——变化速度匀速,位置每帧接近,当t>=1时,得到结果
time += Time.deltaTime;
result = Mathf.Lerp(start, 10, time);
#endregion
}
}
三角函数
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class lesson2 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
#region 弧度、角度相互转换
//弧度转角度
float rad = 1;
float anger=rad*Mathf.Rad2Deg;
print(anger);//57.29578
//角度转弧度
anger = 1;
rad = anger * Mathf.Deg2Rad;
print(rad);//0.01745329
#endregion
#region 三角函数
//注意:Mathf中的三角函数,传入的参数需要时弧度值
print(Mathf.Sin(30 * Mathf.Deg2Rad));//0.5
print(Mathf.Cos(60 * Mathf.Deg2Rad));//0.5
#endregion
#region 反三角函数
//注意:反三角函数得到的结果是 正弦或者余弦值对应的弧度
rad = Mathf.Asin(0.5f);
print(rad*Mathf.Rad2Deg);//30
rad = Mathf.Acos(0.5f);
print(rad * Mathf.Rad2Deg);//60
#endregion
}
}
坐标系
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class lesson3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
#region 世界坐标系
//目前学习的和世界坐标系相关的
//this.transform.position;
//this.transform.rotation;
//this.transform.eulerAngles;
//this.transform.lossyScale;
#endregion
#region 物体坐标系
//相对父对象的物体坐标系的位置 本地坐标 相对坐标
//this.transform.localPosition;
//this.transform.localRotation;
//this.transform.localEulerAngles;
//this.transform.localScale;
//修改他们 会是相对父对象物体坐标系的变化
#endregion
#region 屏幕坐标系
//Input.mousePosition;
//Screen.width;
//Screen.height;
#endregion
#region 视口坐标系
//摄像机上的 视口范围
#endregion
#region 坐标转换相关
//世界转本地
//this.transform.InverseTransformDirection;
//this.transform.InverseTransformPoint;
//this.transform.InverseTransformVector;
//本地转世界
//this.transform.TransformDirection;
//this.transform.TransformPoint;
//this.transform.TransformVector;
//世界转屏幕
//Camera.main.WorldToScreenPoint
//屏幕转世界
//Camera.main.ScreenToWorldPoint
//世界转视口
//Camera.main.WorldToViewportPoint
//视口转世界
//Camera.main.ViewportToWorldPoint
//视口转屏幕
//Camera.main.ViewportToScreenPoint
//屏幕转视口
//Camera.main.ScreenToViewportPoint
#endregion
}
}
向量模长和单位向量
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class lesson4 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
#region 向量
//三维向量-Vector3
//Vector3有两种几何意义
//1.位置——代表一个点
print(this.transform.position);
//2.方向——代表一个方向
print(this.transform.forward);
print(this.transform.up);
Vector3 v3 = new Vector3(1, 2, 3);
Vector2 v2 = new Vector2(1, 2);
#endregion
#region 两点决定一向量
//A和B此时 几何意义是两个点
Vector3 A = new Vector3(1, 2, 3);
Vector3 B = new Vector3(5, 1, 5);
//求向量
//此时 AB和BA代表的 是两个向量
Vector3 AB = B - A;
Vector3 BA = A - B;
#endregion
#region 零向量和负向量
print(Vector3.zero);
print(Vector3.forward);
print(-Vector3.forward);
#endregion
#region 向量的模长
//Vector3中提供了获取向量模长的成员属性
print(AB.magnitude);
Vector3 C = new Vector3(5, 6, 7);
print(C.magnitude);
//Vector3.Distance(A, B);
#endregion
#region 单位向量
//Vector3中提供了获取单位向量的成员属性
//normalized
print(AB.normalized);
print(AB/AB.magnitude);
#endregion
}
//总结
//1.Vector3 可以表示一个点 也可以表示一个向量 具体表示什么 是根据我们的具体需求和逻辑决定
//2.如何在Unity里面得到向量 终点减起点 就可以得到向量 点也可以代表向量 代表的就是oc向量 o是坐标系原点
//3.得到了向量 就可以利用Vector3中提供的成员属性 得到模长和单位向量
//4.模长相当于可以得到两点之间的距离 单位向量 主要是用来进行移动计算的 它不会影响我们想要的移动效果
}
向量加减乘除
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class lesson5 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
#region 向量加法
//this.transform.position+=new Vector3 (1,2,3);
this.transform.Translate(Vector3.forward * 5);
#endregion
#region 向量减法
//this.transform.position-=new Vector3 (1,2,3);
this.transform.Translate(-Vector3.forward * 5);
#endregion
#region 向量乘除标量
this.transform.localScale *= 2;
this.transform.localScale /= 2;
#endregion
}
}
向量点乘
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class lesson6 : MonoBehaviour
{
public Transform target;
void Start()
{
}
// Update is called once per frame
void Update()
{
#region 调试画线
//在场景窗口显示,游戏窗口不显示
//画线段
//前两个参数 分别是 起点 终点
//Debug.DrawLine(this.transform.position, this.transform.position+this.transform.forward, Color.red);
//画射线
//前两个参数分别是 起点 方向
//Debug.DrawRay(this.transform.position, this.transform.forward, Color.white);
#endregion
#region 通过点乘判断对象方位
//Vector3 提供了计算点乘的方法
Debug.DrawRay(this.transform.position, this.transform.forward, Color.red);
Debug.DrawRay(this.transform.position, target.position-this.transform.position, Color.red);
//得到两个向量的点乘结果
//向量 a 点乘 AB 的结果
float dotResult = Vector3.Dot(this.transform.forward, target.position - this.transform.position);
if (dotResult >= 0)
print("它在我前方");
else
print("它在我后方");
#endregion
#region 通过点乘推导公式算出夹角
//步骤
//1.用单位向量算出点乘结果
dotResult = Vector3.Dot(this.transform.forward, target.position - this.transform.position);
//2.用反三角函数得出角度
print("角度" + Mathf.Acos(dotResult)*Mathf.Rad2Deg);
//Vector3中提供了 得到两个向量之间夹角的方法
print("角度2" + Vector3.Angle(this.transform.forward, target.position - this.transform.position));
#endregion
}
}
向量叉乘
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class lesson7 : MonoBehaviour
{
public Transform A;
public Transform B;
// Start is called before the first frame update
void Start()
{
#region 向量叉乘计算
print(Vector3.Cross(A.position, B.position));
#endregion
#region 向量叉乘几何意义
//假设向量A和B都在XZ平面上
//向量A叉乘向量B
//y大于0 证明 B在A右侧
//y小于0 证明 B在A左侧
#endregion
}
// Update is called once per frame
void Update()
{
//Vector3 C = Vector3.Cross(A.position, B.position);
//if (C.y > 0)
// print("B在A的右侧");
//else
// print("B在A的左侧");
Vector3 C = Vector3.Cross(B.position, A.position);
if (C.y > 0)
print("A在B的右侧");
else
print("A在B的左侧");
}
}