Unity入门学习Day02

目录

(二)代码控制运动(续)

(2)移动

深入理解Transform

(3)Input类


(二)代码控制运动(续)

(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");

完成作业:控制坦克,摄像机跟随,点击鼠标发射子弹

猜你喜欢

转载自blog.csdn.net/m0_70379630/article/details/125565581
今日推荐