向量的模
向量的方向
向量的运算
计算向量长度、向量以及向量的加减.cs
using UnityEngine;
using System.Collections;
/// <summary>
/// 向量
/// </summary>
public class VectorDemo : MonoBehaviour
{
public Transform t1, t2,t3;
private void Update()
{
Demo03();
}
//计算向量长度
private void Demo01()
{
Vector3 pos = transform.position;
float m1 = Mathf.Sqrt(Mathf.Pow(pos.x, 2) + Mathf.Pow(pos.y, 2) + Mathf.Pow(pos.z, 2));
float m2 = pos.magnitude;
print(m1 + "----" + m2);
}
//计算向量方向
private void Demo02()
{
Vector3 pos = transform.position;
Vector3 n1 = pos / pos.magnitude;
Vector3 n2 = pos.normalized;
Debug.DrawLine(Vector3.zero, n1, Color.red);
}
//向量基本运算
private void Demo03()
{
Vector3 result = t1.position - t2.position;
//需求:t3 沿着 result 方向移动
if (Input.GetKey(KeyCode.A))
//避免两物体的间距对速度造成影响
t3.Translate(result.normalized);
//t3.position = t3.position + result.normalized;
Debug.DrawLine(Vector3.zero, t1.position);
Debug.DrawLine(Vector3.zero, t2.position);
Debug.DrawLine(Vector3.zero, result);
//已知向量a 长度为8.3m
//计算该方向 长度为1.5m的向量
//解决方案:将a向量标准化, 再乘以1.5
}
}
TransformPoint.cs
TransformPoint()将点从自身坐标系转换到世界坐标系,在自身坐标系中物体自身就是原点
//自身坐标 --> 世界坐标
private void Demo06()
{
Vector3 worldPos = transform.TransformPoint(1, 0, 0);
Debug.DrawLine(this.transform.position, worldPos);
//transform.forward
//transform.up
//transform.right
}
练习:计算前右方30度 10米处世界坐标
//练习
private void Demo07()
{
//计算:前右方30度 10米处世界坐标
Vector3 localPos = new Vector3
(
10 * Mathf.Sin(30 * Mathf.Deg2Rad),
0,
10 * Mathf.Cos(30 * Mathf.Deg2Rad)
);
//TransformPoint()将点从自身坐标系转换到世界坐标系,在自身坐标系中物体自身就是原点
Vector3 worldPos = transform.TransformPoint(localPos);
Debug.DrawLine(transform.position, worldPos);
}
点乘和叉乘结合显示0~360°.cs
public float angle;
//向量 向量
private void Demo08()
{
//向量 + - 向量
//向量 * / 数
//向量 (点乘) (叉乘) 向量
//
//参与点乘运算的向量标准化后,结果为夹角的 cos 值
float dot = Vector3.Dot(t1.position.normalized, t2.position.normalized);
angle = Mathf.Acos(dot) * Mathf.Rad2Deg;
//if (angle > 30)//比较角度
if (dot < 0.866f)//比较cos值
{
//如果夹角大于30度则
}
//叉乘和点乘结合可以显示0~360°
Vector3 cross = Vector3.Cross(t1.position, t2.position);
if (cross.y <0)
{
angle = 360 - angle;
}
Debug.DrawLine(Vector3.zero, cross, Color.red);
Debug.DrawLine(Vector3.zero, t1.position);
Debug.DrawLine(Vector3.zero, t2.position);
}
点乘
应用
结果与角度关系
1.a,b做归一化处理以后,a、b做点乘运算就可以直接得到a、b夹角的余弦值。
2.点积夹角的特点:(1)点积结果只能看0~180°(总是显示最小夹角)(如上方第一个图只显示白色小夹角,不显示红色大夹角)(2)点积结果的角度不分正负(如上方第一个图所示)
3.点积的作用:计算两向量的夹角。
4.判断夹角大于某角度的两种表达方式,如上方第三个图所示。
叉乘
应用
结果与角度关系
1.叉乘在unity中判断方向是使用左手定则,因为unity是左手坐标系。
2.叉乘的应用:(1)创建垂直于平面的向量(2)判断两向量的相对位置,当a和b叉乘结果向上的时候,a到b应该是顺时针,当a和b叉乘结果向下的时候,a到b是逆时针。
3.点乘和叉乘结合可以求0~360°。
4.求180°~360°的方法:当a和b叉乘结果向下的时候,a到b是逆时针,所以这时需要使用点乘求得的angle,angle = 360-angle(如上方的图二所示)。
5.上方图三的练习求扇形攻击范围的代码需要注意。
练习:求扇形攻击范围
private void Demo04()
{
//敌人正前方向量
//方法一:
Vector3 Radius = this.transform.TransformPoint(0, 0, 1) - this.transform.position;
//方法二:
//Vector3 Radius = this.transform.forward;
//Debug.DrawLine(this.transform.position, Radius);
float radian = Vector3.Dot(Radius.normalized, (tf.position - this.transform.position).normalized);
angle = Mathf.Acos(radian) * Mathf.Rad2Deg;
distance = Vector3.Distance(this.transform.position, tf.transform.position);
if(angle < 60 && distance <= 20)
Debug.DrawLine(Vector3.zero, transform.position, Color.red);
}
常用属性及方法
物体移动的三种方式.cs(MoveTowards和Lerp的使用)
//自定义比例曲线
public AnimationCurve Curve;
private float x;
//到达终点的秒数 默认初始化是1s
public float duration = 1;
//存放查找标签的那个物体
private GameObject player;
//移动的方式
private void Demo05()
{
//1.匀速移动
//MoveTowards()的参数三是速度
//this.transform.position = Vector3.MoveTowards(this.transform.position, tf.transform.position, 0.1f);
//2.变速移动(先快后慢),只能无限接近目标点 Lerp
//起点不固定,终点固定
//this.transform.position = Vector3.Lerp(this.transform.position, tf.transform.position, 0.05f);
//3.自定义移动
//起点固定,终点固定,比例根据曲线变化
x += Time.deltaTime / duration;
player = GameObject.FindGameObjectWithTag("Player");
player.transform.position = Vector3.Lerp(new Vector3(0, 0, 0), tf.transform.position, Curve.Evaluate(x));
}