Unity入门03——Unity脚本

这篇具有很好参考价值的文章主要介绍了Unity入门03——Unity脚本。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.脚本基本规则

1.设置编程用工具

2.基本规则

1.创建规则

  1. 不在VS中创建脚本了
  2. 可以放在Assets文件夹下的任何位置(建议同一文件夹管理)
  3. 类名和文件名必须一致,不然不能挂载(因为反射机制创建对象,会通过文件名去找Type)
  4. 建议不要使用中文名命名
  5. 没有特殊需求不用管命名空间
  6. 创建的脚本默认继承MonoBehavior

2.MonoBehavior基类

物体脚本的类都继承MonoBahaviour基类(只有继承类MonoBahaviour类才能挂载到GameObject上)

  1. 创建的脚本默认都继承MonoBehaviour继承了它才能够挂载在GameObject上
  2. 继承了MonoBehavior的脚本不能new只能挂!!!!!!!!
  3. 继承了MonnBehavior的脚本不要去写构造函数,因为我们不会去new它。写构造函数没有任何意义
  4. 继承了MonoBehavior的脚本可以在一个对象上挂多个(如果没有加DisallowMultipleComponent特性)
  5. 继承MonoBehavior的类也可以再次被继承,遵循面向对象继承多态的规则

3.不继承MonoBehavior的类

  1. 不继承Mono的类不能挂载在GameObject上
  2. 不继承Mono的类想怎么写怎么写如果要使用需要自己new
  3. 不继承Mono的类一般是单例模式的类(用于管理模块)或者数据结构类(用于存储数据)
  4. 不继承Mono的类不用保留默认出现的几个函数 

4.执行的先后顺序

选中一个脚本点击Execution Order键:

Unity入门03——Unity脚本

会显示如下窗口:
Unity入门03——Unity脚本
点击下图的+按钮可以设置脚本执行顺序:
Unity入门03——Unity脚本
可以添加脚本(NewBehaviourScript是新添加的继承MonoBehaviour类的脚本)
Unity入门03——Unity脚本
Unity入门03——Unity脚本

5.默认脚本内容Editor\Data\Resources\ScriptTemplates

2.生命周期函数 

1.了解帧的概念

游戏的本质就是一个死循环,每一次循环处理游戏逻辑就会更新—次画面,之所以能看到画面在动,是因为切换画面的速度到达一定时,人眼就认为画面是流畅的,—帧就是执行一次循环

游戏卡顿的原因:跑1帧游戏逻辑中的计算量过大,或者CPU不给力,不能在一帧的时间内处理完所有游戏逻辑

Unity 底层已经帮助我们做好了死循环

我们需要学习Unity的生命周期函数

利用它做好的规则来执行我们的游戏逻辑就行了

2.生命周期函数的概念

所有继承 MonoBehaviour 的脚本 最终都会挂载到GameObject游戏对象上

生命周期函数 就是该脚本对象依附的GameObject对象从出生到消亡整个生命周期中会通过反射自动调用的一些特殊函数

Unity帮助我们记录了一个GameObject对象依附了哪些脚本

会自动的得到这些对象,通过反射去执行一些固定名字的函数

3.生命周期函数

注意:

生命周期函数的访问修饰符一般为 private和 protected

因为不需要在外部自己调用生命周期函数 都是 Unity 自己帮助我们调用的

当对象(自己这个类对象) 被创建时 才会调用该生命周期函数

    private void Awake()
    {
        //在Unity中打印信息的两种方式
 
        //1.没有继承MonoBehaviour类的时候
        //Debug.Log("123");
        //Debug.LogError("出错了");
        //Debug.LogWarning("警告");
 
        //2.继承了MonoBehaviour 有一个线程的方法 可以使用
        print("Awake");
    }
 
    //对于我们来说 想要当一个对象被激活时 进行一些逻辑处理 就可以写在这个函数
    private void OnEnable()
    {
        print("OnEable");
    }
 
    //主要作用还是用于初始化信息的 但是它相对于Awake来说 要晚一点
    //因为它是在对象 进行第一次帧更新之前才会执行的
    private void Start()
    {
        print("Strart");
    }
 
    //它主要是用于 进行物理更新
    //它是每一帧的执行的 但是 这里的帧 和游戏帧 有点不同
    //它的时间间隔 是可以在 protect setting中的 Time里去设置的
    private void FixedUpdate()
    {
        print("FixedUpdate");
    }
 
    //主要用于处理游戏核心逻辑更新的函数
    private void Update()
    {
        print("Update");
    }
 
    //一般这个更新是用来处理 摄像机位置更新相关内容的
    //Update 和 LateUpdate 之间 Unity 进行了一些处理 处理我们动画相关的更新
    private void LateUpdate()
    {
        print("LateUpdate");
    }
 
    //如果我们希望在一个对象失活时做一些处理 就可以在该函数中写逻辑
    private void OnDisable()
    {
        print("OnDisable");
    }
 
    private void OnDestroy()
    {
        print("OnDestroy");
    }

4.生命周期函数 支持继承多态 

(这些生命周期函数 如果你不打算在其中写逻辑 那就不要写出这些生命周期函数 )

3.inspector窗口可编辑的变量

1.Inspector显示的可编辑内容就是脚本的成员变量 

2.私有和保护无法显示编辑 

private int i1;
protected string str1;

 Unity入门03——Unity脚本

3.让私有的和保护的也可以被显示 

加上强制序列化字段特性

[SerializeField]

所谓序列化就是把一个对象保存到一个文件或数据库字段中去

    [SerializeField]
    private int privateInt;
    [SerializeField]
    protected string protectedStr;

 Unity入门03——Unity脚本

 4.公共的可以显示编辑

[HideInInspector]
public int publicInt = 10;
public bool publicBool = false;

 Unity入门03——Unity脚本

5.公共的也不让其显示编辑 

在变量前加上特性   [HideInInspector]

    [HideInInspector]
    public int publicInt2 = 50;

Unity入门03——Unity脚本

6.大部分类型都能显示编辑

public enum E_TestEnum
{
    Normal,
    Player,
    Monster
}
[System.Serializable]
public struct MyStruct
{
    public int age;
    public bool sex;
}
[System.Serializable]
public class MyClass
{
    public int age;
    public bool sex;
}
    public int[] array;
    public List<int> list;
    public E_TestEnum type;
    public GameObject gameObj;
 
    //字典不能被Inspector窗口显示
    public Dictionary<int, string> dic;
    //自定义类型变量
    public MyStruct myStruct;
    public MyClass myClass;

Unity入门03——Unity脚本 

 

7.让自定义类型可以被访问 

加上序列化特性  [System.Serializable]

字典怎样都不行

8.一些辅助特性

1.分组说明特性 Header 

为成员分组

Header 特性   [Header("分组说明")]

    [Header("基础属性")]
    public int age;
    public bool sex;
    [Header("战斗属性")]
    public int atk;
    public int def;

2.悬停注释 Tooltip

为变量添加说明    [Tooltip("说明内容")]

    [Tooltip("闪避")]
    public int miss;

3.间隔特性 Spcae()

让两个字段间出现间隔     [Space()]

    [Space()]
    public int crit;

4.修饰数值的滑条范围 Range

[Range(最大值,最小值)]

    [Range(0,10)]
    public float luck;

 5.多行显示字符串 默认不写参数显示3行

写参数就是对应行[Multiline(4)]

    [Multiline()]
    public string tips;

 6.滚动条显示字符串

默认不写参数就是超过三行显示滚动条   [TextArea(3,4)]

最少显示3行,最多4行,超过四行就显示滚动条

    [TextArea(3, 4)]
    public string MyLife;

7.为变量添加快捷方法 ContextMenuItem

参数1 显示按钮名

参数2 方法名 不能有参数

[ContestMenuItem("显示按钮名","方法名")]

    [ContextMenuItem("重置钱", "Test")]
    public int money;
    private void Test()
    {
        money = 0;
    }

 8.为方法添加特性能够在Inspector中执行

[ContextMenu("测试函数")]

    [ContextMenu("哈哈哈")]
    private void TestFun()
    {
        print("测试方法");
    }

Unity入门03——Unity脚本  

9.注意 

1.Inspector窗口中的变量关联的就是对象的成员变量,运行时改变他们就是在改成员变量

2.拖曳到GameObject对象后 再改变脚本中变量默认值 界面上不会改变

3.运行中修改的信息不会保存

4.MonoBehaviour中的重要内容

1.重要成员 

1.获取依附的GameObject

print(this.gameObject.name);

2.获取依附的GameObject的位置信息

得到对象位置信息

        print(this.transform.position);   //位置
        print(this.transform.eulerAngles);//角度
        print(this.transform.lossyScale); //缩放大小
        //这种写法和上面都是一样的效果 都是得到依附的对象的位置信息
        //this.gameObject.transform

3.获取脚本是否激活

        this.enabled = true; //激活
        this.enabled = false;//失活
 
        //获取别的脚本对象 衣服的gameObject和transform位置信息
        print(otherLesson3.gameObject.name);
        print(otherLesson3.transform.position);

2.重要方法

得到依附对象上挂载的其他脚本 文章来源地址https://www.toymoban.com/news/detail-406263.html

1.得到自己挂载的单个脚本

        //根据脚本名获取
        lesson3_Test t=this.GetComponent("lesson3_Test") as lesson3_Test;
        print(t);
 
        //根据Type获取
        t = this.GetComponent(typeof(lesson3_Test)) as lesson3_Test;
        print(t);
 
        //根据泛型获取 建议使用泛型获取 因为不用二次转换
        t = this.GetComponent<lesson3_Test>();
        if (t != null)
        {
            print(t);
        }
        //只要你能够得到场景中别的对象或者对象依附的脚本
        //那你就可以获取到它的所有信息

2.得到自己挂载的多个脚本

        lesson3[] array = this.GetComponents<lesson3>();
        print(array.Length);
        List<lesson3> list = new List<lesson3>();
        this.GetComponents<lesson3>(list);
        print(list.Count);

3.得到子对象挂载的脚本(它默认也会找自己身上是否挂载该脚本)

        //函数是有一个参数的 默认不传 是false
        //意思就是 如果子对象失活 是不会去找这个对象上是否有某个脚本
        //如果传 true 即使失活 也会找
        t = this.GetComponentInChildren<lesson3_Test>();
        print(t);
        //得子对象 挂载脚本 多个
        lesson3_Test[] lts = this.GetComponentsInChildren<lesson3_Test>(true);
        print(lts.Length);
 
        List<lesson3_Test> list2 = new List<lesson3_Test>();
        this.GetComponentsInChildren<lesson3_Test>(true, list2);

4.得到父对象挂载的脚本(它默认也会找自己身上是否挂载了该脚本)

        t = this.GetComponentInParent<lesson3_Test>();
        print(t);
        lts = this.GetComponentsInParent<lesson3_Test>();
        print(lts.Length);
        //它也有list的 和上面相同的套路

5.尝试获取脚本 

        lesson3_Test l3t;
        //提供了一个更加安全的 获取单个脚本的方法 如果得到了 会返回true
        //然后再来进行逻辑处理即可
        if (this.TryGetComponent<lesson3_Test>(out l3t))
        {
          //逻辑处理  
        }

到了这里,关于Unity入门03——Unity脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Python编程从入门到实践》学习笔记03列表

    [‘trek’, ‘cannondale’, ‘redline’, ‘specialized’] trek cannondale redline specialized specialized redline ada lovelace My first bicycle was a Trek. [‘honda’, ‘yamaha’, ‘suzuki’] [‘ducati’, ‘yamaha’, ‘suzuki’] [‘honda’, ‘yamaha’, ‘suzuki’, ‘ducati’] [‘honda’, ‘yamaha’] [‘honda’, ‘yamaha’, ‘

    2024年02月07日
    浏览(38)
  • 【Stable Diffusion】入门-03:图生图基本步骤+参数解读

    当提示词不足以表达你的想法,或者你希望以一个更为简单清晰的方式传递一些要求的时候,可以给AI输入一张图片,此时图片和文字是相当的,都是作为一种信息输送给模型,让它拿来生成一张新的图片。模型可以从图片上获取更多的信息,原本的图片上记录的像素信息会

    2024年03月20日
    浏览(63)
  • Unity 3D游戏开发+脚本编程完整指南:Unity脚本概览-控制物体的运动

    教程相关资源 Unity 3D游戏开发+脚本编程完整指南(工程文件+PPT).zip Unity 脚本概览 脚本编写并不困难,但是如果直接从细节开始讲起,会让 读者难以看到脚本编程的全貌。因此本章不急于阐述脚本编写 的细节,只介绍简单的修改物体位置、处理用户输入和检测碰 撞的方法

    2024年02月21日
    浏览(75)
  • 【Unity】如何设置Unity脚本的执行顺序?

    在 Unity 中,如果有多个脚本,并且它们之间的执行顺序很重要,可以通过编辑器设置来确保它们按照自己期望的顺序执行。这对于确保某些脚本在其他脚本之前执行非常有用。在这篇文章中,将向会展示如何在 Unity 编辑器中设置脚本的执行顺序。 步骤一:打开编辑器设置

    2024年04月15日
    浏览(38)
  • Unity物理系统脚本编程(上)

    当一个物体挂载了刚体时,即可在脚本中获取该物体的刚体组件,代码如下 Rigidbody rigid; void Start() { rigid=GetComponentRigidbody(); } 一般将刚体变量命名为rigid并定义为一个字段,方便复用. 最常用的施加作用力的方法是AddForce(),参数为Vector3类型。代码如下 rigid.AddForce(new Vector

    2024年02月04日
    浏览(99)
  • Linux 系统shell脚本编程笔记——脚本入门

    目录 1、创建shell脚本文件  2、显示消息 3、 环境变量 4、用户变量 5、命令替换 ​编辑  6、重定向输入与输出 6.1、输出重定向  6.2、输入重定向 ​编辑 7、执行数学运算 7.1、expr命令 7.2、bc的基本用法  8、退出脚本 完整笔记请前往此处获取:https://download.csdn.net/download/qq

    2024年02月06日
    浏览(68)
  • Unity 3D脚本编程与游戏开发(3.2)

    5.3.4 制作背包界⾯         背包界⾯是此实例中的重点,因为它的屏幕适配⽐较有代表性。当屏幕⽐较“瘦⾼”时,道具列表中能显⽰更多道具项,⽽屏幕⽐较“矮胖”时,显⽰的道具项会变少。但这些都不影响玩家通过下拉滑动查看所有道具,如图5-37所⽰。       

    2024年04月12日
    浏览(63)
  • Unity 3D脚本编程与游戏开发(2.5)

    4.3.4 向量的点积         两个向量的点积是⼀个标量,其数值为两者⻓度相乘,再乘以两者夹⾓的余弦: a·b=|a|·|b|cosθ⽤坐标表⽰,公式为 (x1,y1,z1)·(x2,y2,z2)=x1x2+y1y2+z1z2         注意到,两个向量的点积是⼀个数(标量),只有⼤⼩,没有⽅向。⽽且点乘满⾜交换律,

    2024年02月03日
    浏览(46)
  • Unity 3D脚本编程与游戏开发【4.1】

    7.2.5 后期处理举例 Post Processing(后期处理)并不属于特效,但现代的特效表现离不开后期处理的⽀持。本⼩节以眩光(Bloom)为例,展⽰⼀种明亮的激光的制作⽅法,其效果如图7-13所⽰。 1. 安装后期处理扩展包         较新的Unity版本(如2018.4版本)已经内置了新版的后

    2024年04月26日
    浏览(42)
  • Unity 3D脚本编程与游戏开发(2.6)

    4.5.2 四元数的概念         四元数包含⼀个标量分量和⼀个三维向量分量,四元数Q可以记作Q=[w,(x,y,z)]         在3D数学中使⽤单位四元数表⽰旋转,下⾯给出四元数的公式定义。对于三维空间中旋转轴为n,旋转⾓度为a的旋转,如果⽤四元数表⽰,则4个分量分别为

    2024年02月03日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包