Unity入门
DAY 一:
向量Vector
- 向量的长度
Vector2 :长度 = sqrt( x2 + y2 )
Vector3 :长度 = sqrt( x2 + y2 + z2 )
可直接使用API求长度:
float len = v.magnitude;
- 向量的标准化Normalize
将向量的长度缩放成1,即单位向量
示例: (2,2) --> (0.707,0.707) 、(3,4) --> (0.6,0.8)
使用API进行标准化,示例:
Vector3 a = new Vector3(3f,4f,0);
Vector3 b = a.normalized;
Debug.log("标准化为: " + b.ToString("F3"));
//F3表示在打印显示时保留3位小数;
//注:向量打印默认显示保留一位小数
- 几个常用的标准向量(静态向量)
Vector3.right; //Vector3(1,0,0)
Vector3.up; //Vector3(0,1,0)
Vector3.forward;//Vector3(0,0,1)
向量夹角
从a到b的夹角:示例
Vector3 a = new Vector3(2,2,0);
Vector3 b = new Vector3(-1,3,0);
float angle1 = Vector3.SignedAngle(a,b,Vector3.forward);//顺着z轴进行旋转,带符号的,负为逆时针,正为顺时针
float angle2 = Vector3.Angle(a,b);
Debug.Log("a到b的夹角为:" + angle1);
物体的指向
示例:让一个飞机指向子弹,然后飞机向子弹移动
void Start()
{
//本物体的现指向:Y轴
Vector3 face = this.transform.up;
//找到所要指向的物体
GameObject target = GameObject.Find("子弹");
//找到两个物体之间的方向:两物体的空间坐标相减
Vector3 direction = target.transform.position - this.transform.position;
//一个是Y轴标准向量,一个两物体之间的向量,得到旋转角度
float angle = Vector3.SignedAngle(face,direction,Vector3.forward);
//旋转
this.transform.Rotate(0,0,angle);
}
void Update()
{
float step = 1.2f * Time.deltaTime;
//机头指向沿自己的Y轴指向前进
transform.Translate(0,step,0,Space.Self);
}
屏幕坐标
游戏中的物体,有两个坐标:
空间坐标: transform.position
该物体在世界空间中的坐标
屏幕坐标
通过屏幕(摄像头)观察,该物体在屏幕上的位置
屏幕坐标系:
- y轴向上,x轴向右 ,左下角为(0,0);
- 宽度Screen.width(像素);高度Screen.height(像素)
获取一个物体的屏幕坐标:
Vector3 pos = transform.position;
Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);//单位为像素
注:因为屏幕边界(左右)的不确定,所以去判断小物体是否移动至屏幕边界,得用屏幕坐标。
示例:让一架飞机左右飞行,不能超出屏幕边界
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class point : MonoBehaviour
{
private bool toRight = true; //用于判断是否到达屏幕边界
// Start is called before the first frame update
void Start()
{
//让机头顺时针旋转90向右
transform.eulerAngles = new Vector3(0,0,-90);
}
// Update is called once per frame
void Update()
{
//得到物体的屏幕坐标
Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);
//到达右边界后向左旋转
if( toRight && sp.x > Screen.width) {
toRight =