【Unity3D】物体、材质的设置、物体位移与旋转

Unity3D和Flash一样,甚至可以说是和C#一样,拖完组件,再写一系列的脚本,完成编程,甚至可以说,就是带编程脚本的3DSMAX。那么如何完成最基本的物体、材质的设置、物体位移与旋转呢?下面用一个简单的Unity3D说明这个问题,如下图所示:


在一个面板上面有一个可以控制的立方体与不可以控制的球体和立方体各2个,然后可以控制立方体的位移与旋转。概念的东西就不写了,具体步骤如下。

一、场景设置

1、如下图所示,在GameObject里面,选择需要的东西,在场景一拖就可以创建相应的物体了。


除了默认自带的摄像机和光源,我们要设置3个立方体,2个球,1个地面。

在设置的时候,还可以像画图、Flash、C#那样用CTRL+C、CTRL+V复制、粘贴物体。

2、之后,点击任意一个物体,再右边的Inspector就可以设置相应的属性。这和C#设置控件的基本控件,和Flash设置资源的属性不就是同一个意思吗?

不过由于在3D界面不像2D那样好控制组件的位置,基本上我们是需要在Inspector界面的Transform项,直接输入坐标控制物体的位置。

如下图所示(在没有设置材质之前,这些东西应该都是白色的),默认情况下,Y是上下方向,XZ是平面的纵横,这就是公认的三维笛卡儿坐标系设置,没什么好说的。


各个组件的坐标Position,旋转Rotation和缩放Scale如下图所示。Position指坐标,物体中心点所处的位置,所以如果物体要放在Plane上面,则要处于Y轴0.5的位置,Rotation指的是物体绕哪一轴旋转的角度,Scale则是单位物体的XYZ轴半径沿此轴拓宽的多少。

理论上,刚才GameObject中所有单位的立体靠各种坐标偏移,角度偏移与形变能表示三维世界的所有东西,就像二维世界的所有东西,是由点、直线、曲线所组成。


3、物体设置好之后,我们则要给各个物体上色,也就是给各个物体贴上材质。这里不要有windows自带颜色版的惯性思维,“颜色”也就是材质,不是说有就有,直接能在Inspector中设置的,是需要我们自己新建的,具体如下:


以上只是设置简单的纯色材质。材质的设置在3D领域同样是一种学问,就像如何用HTML+CSS的颜色配搭弄好一个网页一样。

这里设置材质,只是基本的入门,未来这个方面肯定可以深究一番。

现在游戏美工缺,高收入也就是因为如此,材质可以说是2D美工的3D版。

言归正传,如图设置黑色材质给予地板,蓝色材质给予预设为不能动的物理,红色材质设定给我们中间的主角。

4、至此,场景终于布置完毕,如下图所示,选择各个物体(2个球体、3个立方体),【Component】->【Physics】->【Rigidbody】,将所有物体设置为刚体,用于真实的物理碰撞之后,则可以进行脚本的编写。


二、脚本编写

显然按钮是通过脚本创建的。

如何新建脚本在《【Unity3D】Helloworld》(点击打开链接)说过了,这里就不再赘述了。

给予如下的脚本给中间的红色立方体。

using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;//重新开始游戏,切换场景SceneManager.LoadScene("Scene1");需要。
using UnityEngine;

public class script : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }

    //初始化变换方法。
    public Transform transform;
    void Awake()
    {
        transform = this.GetComponent<Transform>();
    }

    float moveSpeed = 20;//物体移动速度

    void OnGUI()//OnGUI用于画面绘制
    {
        //这里的rect就是指在左上角坐标(10,10)这个100x30像素的区域位置。
        if (GUI.Button(new Rect(10, 10, 100, 30), "向左旋转30度"))//GUI.Button用于创建按钮
        {
            transform.Rotate(-Vector3.up * 30);//30就是指30度
        }
        if (GUI.Button(new Rect(110, 10, 100, 30), "向右旋转30度"))
        {
            transform.Rotate(Vector3.up * 30);
        }
        if (GUI.Button(new Rect(210, 10, 100, 30), "重新开始"))
        {
            SceneManager.LoadScene("Scene1");//Application下的方法已经被标识过期
        }
        if (GUI.Button(new Rect(10, 50, 100, 30), "向上移动"))
        {
            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
        }
        if (GUI.Button(new Rect(110, 50, 100, 30), "向下移动"))
        {
            transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);//Time.deltaTime指一帧时间,这样据说可以平滑视觉差
        }
        if (GUI.Button(new Rect(210, 50, 100, 30), "向左移动"))
        {
            transform.Translate(-Vector3.right * moveSpeed * Time.deltaTime);
        }
        if (GUI.Button(new Rect(310, 50, 100, 30), "向右移动"))
        {
            transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
        }
        GUI.Label(new Rect(10, 100, 400, 30), "模型位置" + transform.position);//transform.position可以获取模型位置
    }
}

具体请看注释。

Unity3D里面没有向后移动和像左移动,统一用负的.forward和负的.right实现。

Vector3直接可以使用,无须初始化,一般是指给赋予脚本的对象。

SceneManager.LoadScene("Scene1");在Unity3D内部调试时候,灯光会因场景重置变暗,但发布成exe之后不会有这样的问题。

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值