目录
(二)代码控制运动(续)
(2)移动
transform.Translate();
void Update()
{
//第一种,朝着自身坐标系x方向移动,每帧移动1m;
transform.Translate(new Vector3(1, 0, 0));
//第二种,朝着世界坐标系X方向移动,每帧移动1m;
transform.Translate(new Vector3(1, 0, 0),Space.World);
//第三种,朝着指定物体的坐标系X轴方向进行移动,每帧移动1m;
transform.Translate(new Vector3(1, 0, 0),target.transform);
}
transform.LookAt();
void Update()
{
//使自身Z轴朝向目标物体所在的位置方向
transform.LookAt(target.transform.position);
}
深入理解Transform
Transform是一个组件,transform.gameObject指的是挂载了这个transform组件的游戏物体。
transform.SetParent();
public Transform target;
void Start()
{
//将目标物体设置成父物体,或者说将自身成为目标物体的子物体
transform.SetParent(target.transform);
}
transform.GetChild(i);
根据index来查找子物体,特性:子物体的子物体是不会管的。transform.childCount是子物体的数量;
transform.Find(“游戏物体名字”);查找子物体,也不会关注子物体的子物体。
扩展学习:其他查找物体的方式
GameObject.Find("游戏物体名字");在场景中查找物体,遍历查找效率很低。
GameObject.FindGameObjectWithTag(“Tag名称”);根据物体Tag标签名来查找物体。查找到的是最后创建的Tag是某Tag名称的游戏物体。
GameObject.FindGameObjectsWithTag("NPC");当场景中有多个游戏物体Tag是某Tag名称时。同时查找到,并返回一个游戏物体数组。
以上方法都有各自的缺点,所以衍生出递归查找子物体,效率高,查找精确
/// <summary> /// 通过深度递归查找根节点下的某子物体Transform /// </summary> /// <param name="objectName">待查找的物体名称</param> /// <param name="Start">挂载脚本的物体,查找的起点</param> /// <returns>查找的结果</returns> Transform FindChild(string objectName,Transform Start)//2 4 { if (objectName == Start.name) //起点位置即为要找的物体,找到就退出,这是退出条件 return Start; if (Start.childCount < 1) //起点位置不能没有子物体,不然就退出,这是退出条件 return null; #region 这才是递归的核心,深度递归 Transform obj = null; for (int i = 0; i < Start.childCount; i++) { Transform t = Start.GetChild(i); obj = FindChild(objectName, t); if (obj != null) { break; } } return obj; #endregion }
(3)Input类
void Update()
{
//按下A被调用,仅在按下的过程中被调用1次,按住不放也是调用1次。
if(Input.GetKeyDown(KeyCode.A))
{
Debug.Log("A按下时被调用");
}
//松开A被调用,仅在松开的过程中被调用1次
if (Input.GetKeyUp(KeyCode.A))
{
Debug.Log("A松开时被调用");
}
//在A被按住的时候调用,按住不放会持续调用。
if (Input.GetKey(KeyCode.A))
{
Debug.Log("A按下时被持续调用");
}
/*---------------------------------------------------------------------
0代表鼠标左键。1代表鼠标右键,2代表鼠标中键*/
//鼠标按下的瞬间调用1次,鼠标持续按住不会重复调用
if(Input.GetMouseButtonDown(0))
{
Debug.Log("鼠标左键按下时调用");
}
//鼠标松开的瞬间调用1次
if (Input.GetMouseButtonUp(0))
{
Debug.Log("鼠标左键松开时调用");
}
//鼠标持续按住时调用
if (Input.GetMouseButton(0))
{
Debug.Log("鼠标左键按住时调用");
}
}
还有一个比较重要的方法是GetAxis和GetAxisRaw;区分值变化是否有渐变过程的区别
//摁下左右键,会反馈从-1~1的小数,有个渐变的过程
float h = Input.GetAxis("Horizontal");
//摁下上下键,会反馈从-1~1的小数,有个渐变的过程
float v = Input.GetAxis("Vertical");.
//摁下左右键,会反馈从-1、1中某个小数,松开时返回到0,无渐变的过程
float hr = Input.GetAxisRaw("Horizontal");
//摁下上下键,会反馈从-1、1中某个小数,松开时返回到0,无渐变的过程
float vr = Input.GetAxisRaw("Vertical");
完成作业:控制坦克,摄像机跟随,点击鼠标发射子弹