Unity学习笔记——Part 10
一、坐标与旋转
1. 节点的坐标、旋转
节点的坐标、旋转,都是Vector3表示
transform.position = new Vector3(0, 1.0f, 0); //指定位置
transform.eulerAngles = new Vector3(0, 0, 90f); //指定角度
Euler Angle 为欧拉角,即用直观的角度来表示旋转
transform.rotation 是用Vector4表示旋转,较为复杂
2. 世界坐标、本地坐标
世界坐标: World Space Position,以世界的坐标系计算
本地坐标: Local Space Position,以父节点的坐标系计算
transform.localEulerAngles = new Vector3(0, 0, 180);//相对角度
transform.localPosition = new Vector3(0, -2f, 0); //相对位置
诸如子弹相对飞机运动,可以用本地坐标设置子弹的位置
二、物体的运动
transform.Translate(dx, dy, dz) 用于实现运动
- 基于自身方向移动
transform.Translate(0, 0.02f, 0, Space.Self); //移动基于自身的坐标系
- 基于世界方向移动
transform.Translate(0, 0.02f, 0, Space.World); //移动基于世界的坐标系
- 匀速移动
由于Update()是每次刷新调用一次,而每帧的间隔时间不同,因此上述运动的速度是变化的。在类中添加 speed 属性作为移动的速度,设置权限为 public 则可以在Unity中改变速度动态调试。Time.deltaTime 是每帧的间隔时间,用速度×时间作为移动距离,从而使速度保持一致。
//写在类中
----------------------------------------------------
public float speed = 1.2f;
----------------------------------------------------
//写在Update()中
----------------------------------------------------
transform.Translate(0, speed * Time.deltaTime, 0);
----------------------------------------------------
三、飞机掉头飞行
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyJet : MonoBehaviour
{
private float speed = 1.6f;
private bool direction = true;//true表示飞机正在向上飞
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (direction && transform.position.y > 5)
{
direction = false;
transform.localEulerAngles = new Vector3(0, 0, 0);
}
if (!direction && transform.position.y < -5)
{
direction = true;
transform.localEulerAngles = new Vector3(0, 0, 180);
}
transform.Translate(0, -speed * Time.deltaTime, 0);
}
}
四、键盘控制物体运动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyJet : MonoBehaviour
{
private char direction = 'u';
private float speed = 1.6f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.UpArrow))
{
direction = 'u';
}
if (Input.GetKey(KeyCode.DownArrow))
{
direction = 'd';
}
if (Input.GetKey(KeyCode.LeftArrow))
{
direction = 'l';
}
if (Input.GetKey(KeyCode.RightArrow))
{
direction = 'r';
}
if (Input.GetKey(KeyCode.Space))
{
direction = 'p';
}
switch (direction)
{
case 'u':
transform.localEulerAngles = new Vector3(0, 0, 0);
speed = 1.6f;
break;
case 'd':
transform.localEulerAngles = new Vector3(0, 0, 180);
speed = 1.6f;
break;
case 'l':
transform.localEulerAngles = new Vector3(0, 0, 90);
speed = 1.6f;
break;
case 'r':
transform.localEulerAngles = new Vector3(0, 0, -90);
speed = 1.6f;
break;
case 'p':
speed = 0;
break;
}
transform.Translate(Vector3.up * Time.deltaTime * speed);
}
}
本脚本挂载在飞机对象上,通过键盘的方向键及空格控制飞机的运动方向和暂停,虽然程序很简单,不过看到飞机能随心所欲地动起来,还是非常有成就感的!