Unity C#学习

周飞飞的C#学习笔记 #Day 3

Posted on 2021-03-02,5 min read

现在主要开始着手学习Unity中的C#✊

学习主要参考B站教程
po一下我看的教程:
M_Studio的基础教程:老师讲的很好很仔细,可惜由于官方教程出了后就没再更新啦。
Unity官方初级教程

今日重点

1. 变量的使用与计算

  1. 使用public创建Unity界面可见可控的变量
  2. 使用GameObject类型来创建游戏对象,获得在代码中使用该对象所有组件的使用权,想使用哪一个组件,就在代码中生成该组件的一个实例
  3. 使用Transform类型来控制Transform组件,Transform声明的实例可以表示该实例的位置
  4. 可以在Unity界面直接修改变量的值

2. 常见指令

  1. Start():当在Unity中点击开始时,包含在Start()中的所有指令会被执行
  2. Update():每一帧执行一次
  3. Awake():无论script是否启动,都在开始的时候运行
  4. 使用Debug类的方法来观测Unity中点击开始后Console栏中的情况
  5. 使用Input类的方法来获取键盘、鼠标的输入(注意参数的输入方式)
  6. 详细信息请参考今日练习

3.代码生命周期

  1. 参考Unity手册:ExecutionOrder
  2. 执行周期与代码顺序无关

4.数组

  1. 在代码中直接生成一个数组而不初始化,可以在Unity界面中自由调控
  2. 可以结合Tag进行多个物品的管控

5.矢量数学

  1. Unity3D 采用左手坐标系
  2. 向量的点积:可以使用Vector3.Dot(Vector1,Vector2)来完成点积的运算
  3. 向量的叉积(向量积):可以使用Vector3.Cross(Vector1,Vector2)来完成叉积的运算

6.组件的禁用与启用

  1. 可以使用.enabled来禁用和启用某个组件

7.激活游戏对象

  1. 可以使用.setActive(bool值)来激活游戏对象

8.Translate和Rotate

  1. 在transform.translate()中,乘上Time.deltaTime让物体以每秒多少米的速度移动,而不是每帧多少米
    示例:transform.Translate(Vector3.forward * speed * Time.deltaTime);
  2. 想要物体产生物理效果时,就不应该用translate和rotate来移动物体,而应该用physics函数

今日练习

戳我戳我
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Start is called before the first frame update
    public int health = 5;
    public float speed = 3.5f;  //public会出现在Unity界面中
    private int height = 3;     //private不会出现在Unity界面中
    public GameObject player;
    public Transform playermovement;
    private Light mylight;      //声明一个light组件的实例
    public GameObject [] cubes;

    private void Awake()                                   //无论script是否启动,都在Start之前运行
    {
        //Debug.Log("周飞飞牛逼!");               //用于显示括号中的字符
    }

    private void OnEnable()                                //只要script启用了,就会在Start之前运行
    {

    }

    void Start()
    {
        cubes = GameObject.FindGameObjectsWithTag("cube"); //用该语法对标签的物品进行管控
        mylight = GetComponent<Light>();                   //给该组件实例赋值,让这个组件实例能够控制Light组件

    }

    private void FixedUpdate()                             //处理所有的物理数据,如刚体等,可在Unity中进行详细设置
    {
        //FixedUpadate的间隔时间是固定的,而Update的间隔时间不是固定的
    }

    private void OnTriggerEnter(Collider other)            //触发器  
    {

    }

    private void OnCollision(Collision collision)          //碰撞判定
    {

    }

    private void OnMouseDown()                               //指鼠标进行XX操作
    {
        //其中,比较特殊的是Down可以视作移动设备的屏幕触摸。但Up不能再Iphone上实现
    }


    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.D))
        {
            playermovement.transform.position = new Vector3(playermovement.transform.position.x+1, 1); 
            //此处需要注意position.x不能使用++,而应该是直接+1,因为++相当于多了一个给自身赋值的操作
        }
        if(Input.GetKeyDown(KeyCode.Space))   //按下空格来切换灯光
        {
            mylight.enabled = !mylight.enabled; //可以不停切换
            Debug.Log("切换灯光");
        }
        if(Input.GetKeyDown(KeyCode.W))
        {
            transform.Translate(Vector3.forward * speed * Time.deltaTime);
        }
        if(Input.GetKeyDown(KeyCode.S))
        {
            transform.Translate(-Vector3.forward * speed * Time.deltaTime);
        }
    }

    private void LateUpdate()                                 //同样每帧执行,但在Update之后
    {

    }

    private void OnGUI()                                    //用于屏幕界面的设置,按钮等
    {
        GUI.Button(new Rect(10,10,100,150),"Hello");          //此处记得Rect需要new,因为它是一种类型,而不是一个实例
    }

    private void OnDestory()                                  //最后销毁
    {

    }
}

今日总结

今天上了差不多一天的B站大学,在M_Studio上了8节课后转战Unity官方的C#初级教程,并且学习了一半,其实难度不大,主要是要在学的同时用VS进行练习。目前学校的节奏还挺舒服的,虽然都说学习Unity应该多去尝试做项目,但我始终还是觉得至少把C#基础掌握好,才能更快地掌握项目的节奏。
总之,明天再继续努力吧!
😁😁😁


下一篇: 周飞飞的C#学习笔记 #Day 2→

loading...