通过C#脚本实现旋转的立方体

一、介绍

目的:通过一个简单的例子(鼠标点击,使立方体旋转和变色)熟悉Unity中C#脚本的编写。

软件环境:Unity 2017.3.0f3 、 VS2013。

二、C#脚本实现

1,启动Unity,创建游戏场景。【关于Unity基本操作请点击 Unity入门教程(上)进行了解】

2,在Assets目录下创建文件夹,用于存放游戏的各种资源。

3,创建一个名为CubeRotate的C#脚本并拖放到场景的方块上,调整好相机位置。

4,双击打开脚本,在脚本中加入鼠标相关函数

5,设定一个功能:当鼠标光标移动到物体上时,物体材质色彩变为黄色。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeRotate : MonoBehaviour {

    private bool bCube1 = false;
    private bool bCube2 = false;
    private Color OldColor;

    // Use this for initialization
    void Start () {
        OldColor = this.gameObject.GetComponent<Renderer>().material.color; //获取物体的原始颜色
    }
    
    // Update is called once per frame
    void Update () {
        
    }

    void OnMouseOver()
    {
        this.gameObject.GetComponent<Renderer>().material.color = Color.yellow; //立方体变为黄色
        bCube1 = true;
    }
    void OnMouseExit()
    {
        this.gameObject.GetComponent<Renderer>().material.color = OldColor; //立方体变为原始颜色
        bCube1 = false;
    }
    void OnMouseDown()
    {
        if(bCube1)
        {
            bCube2 = true;
        }
    }

}

代码解读:当鼠标光标移动到物体上时,物体变为黄色,同时将一个初始值为false的bCube1的值变为true;当鼠标光标离开后,物体材质色彩还原,bCube1为false;当按下鼠标左键,且bCube1的值为true,bCube2的值为真。

注:OnMouse函数都是执行一次的函数,因此不能将与动画有关的控制函数放于其内执行,所以通常会用布尔值开关来控制Update函数中的动画函数。

6,在Update函数里实现Cube转动

    void Update () {
        if(bCube2) //当Cube为真时
        {
            this.gameObject.transform.Rotate(Vector3.up * Time.deltaTime * 200);  //Cube转动
        }
    }

因为Cube转动是持续性的,所以把旋转脚本写在Update函数里面实现Cube转动。

7,更改Spotlight的强度

    // Use this for initialization
    void Start () {
        OldColor = this.gameObject.GetComponent<Renderer>().material.color; //获取物体的原始颜色
        GameObject.Find("Spotlight").GetComponent<Light>().intensity = 1.0F;  //获取Spotlight的强度属性
    }
    
    // Update is called once per frame
    void Update () {
        if(bCube2) //当Cube为真时
        {
            this.gameObject.transform.Rotate(Vector3.up * Time.deltaTime * 200);  //Cube转动
            if(GameObject.Find("Spotlight").GetComponent<Light>().intensity < 8.0F)
            {
                GameObject.Find("Spotlight").GetComponent<Light>().intensity += 0.05F;
            }
        }
    }

8,UGUI的使用->添加Text组件

9,添加控制Text显示的脚本

使用UGUI组件必须在C#脚本中添加UI的命名空间,这样我们才能引用。当bCube2的值为真时,Text组件显示“Cube正在旋转中...”,所以在Update函数的if语句里面应添加以下脚本

            GameObject.Find("Text").GetComponent<Text>().text = "Cube正在旋转...";

10,点击“Play”按钮,运行游戏

鼠标点击前:

鼠标点击后:

11,完整脚本代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  //添加UI的命名空间

public class CubeRotate : MonoBehaviour {

    private bool bCube1 = false;
    private bool bCube2 = false;
    private Color OldColor;

    // Use this for initialization
    void Start () {
        OldColor = this.gameObject.GetComponent<Renderer>().material.color; //获取物体的原始颜色
        GameObject.Find("Spotlight").GetComponent<Light>().intensity = 1.0F;  //获取Spotlight的强度属性
    }
    
    // Update is called once per frame
    void Update () {
        if(bCube2) //当Cube为真时
        {
            this.gameObject.transform.Rotate(Vector3.up * Time.deltaTime * 200);  //Cube转动
            GameObject.Find("Text").GetComponent<Text>().text = "Cube正在旋转...";

            if(GameObject.Find("Spotlight").GetComponent<Light>().intensity < 8.0F)
            {
                GameObject.Find("Spotlight").GetComponent<Light>().intensity += 0.05F;
            }
        }
    }

    void OnMouseOver()
    {
        this.gameObject.GetComponent<Renderer>().material.color = Color.yellow; //立方体变为黄色
        bCube1 = true;
    }
    void OnMouseExit()
    {
        this.gameObject.GetComponent<Renderer>().material.color = OldColor; //立方体变为原始颜色
        bCube1 = false;
    }
    void OnMouseDown()
    {
        if(bCube1)
        {
            bCube2 = true;
        }
    }

}

三、总结

通过学习我们了解了C#脚本对于游戏对象的作用,中间还学习了UGUI的使用。

Unity脚本语言的综合应用并不是通过一个实例就能够达到熟练的程度,还需要自己不断地练习和探索,不断的尝试bug和及时总结。 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯Bugly的专栏

Android自绘动画实现与优化实战——以Tencent OS录音机波形动画为实例

前言 我们所熟知的,Android 的图形绘制主要是基于 View 这个类实现。 每个 View 的绘制都需要经过 onMeasure、onLayout、onD...

3754
来自专栏hbbliyong

Unity3D学习笔记第一课

第一课程: 1.Unity类名必须与文件名保持一致 2.讲属性设置为public可以在Unity中访问 public float speed; // ...

3667
来自专栏林德熙的博客

WPF 使用 SharpDX

先介绍一下 SharpDx ,一个底层封装的 DirectX 库,支持 AnyCpu ,支持 Direct3D9, Direct3D11, Direct3D12...

1741
来自专栏Android群英传

Android Vector曲折的兼容之路

1643
来自专栏华章科技

纯干货:手把手教你用Python做数据可视化(附代码)

导读:制作提供信息的可视化(有时称为绘图)是数据分析中的最重要任务之一。可视化可能是探索过程的一部分,例如,帮助识别异常值或所需的数据转换,或者为建模提供一些想...

3712
来自专栏十月梦想

CSS3动画animation

        animation和上次说的transform动画有点不同,需要进行定义动画规则,而animation则无需受体,自动执行动画,translat...

903
来自专栏牛客网

新鲜出炉的百度-春招-前端面经

1. 自我介绍 2. 项目经验,我说项目名说错了,然后又说了一遍,面试官不知道什么心态的鬼魅一下 3. Html5不同于以前版本的特点 4. Html5新增ap...

36211
来自专栏walterlv - 吕毅的博客

WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)

发布于 2018-06-15 01:22 更新于 2018-09...

1223
来自专栏菩提树下的杨过

silverlight中"制作逐帧动画"/"播放gif"收集

“逐帧动画”与“播放GIF”貌似二个风马牛不相干的问题,其实不然! 因为silverlight中的image控件不支持直接把gif动画做为source,所以象做...

2007
来自专栏移动开发面面观

GIF格式解析

3575

扫码关注云+社区