unity基本知识及小球旋转实现

Unity 部分

一、unity hub

下载unity,创建项目

二、项目介绍

1、文件含义

Assets -------------------- 存放资源(场景,脚本,素材)

lib ------------------------ 库

logs ----------------------- 日志

package ----------------- 包

projectsetting -------- 工程相关设置

Temp -------------------- 临时文件夹

2、页面布局

右上角可以改变页面布局

可以在editor里面进行设置

3、创建脚本和场景

project -> assets -> 右键 -> create -> c# script

project -> assets -> 右键 -> create -> scene

三、项目基本操作

1、各窗口作用

project 窗口 :查看项目

场景窗口:可以在场景中创建物件

检视窗口(右边):查看属性

2、视角

平行视角:按照大小等比的投影到平面上面

透视视角:按照透视关系显示

3、坐标

世界坐标:一成不变,唯一确定

局部坐标:其他物件都以世界坐标为基础,确定局部坐标

4、工具栏和快捷键

视角工具:q

移动工具:w

旋转工具:e

缩放工具:r

也可以在transform中通过改变

position、rotation、scale的值来实现上述功能

快速聚焦:f

复制:ctrl + d

一个游戏物体有两个组件

1.renderer 组件:控制渲染的组件

2.collider 组件:控制碰撞的组件(简化模型,用于包裹物件,检测碰撞)

pivot:建模时的原点,中心点,建模时确定,位于模型的中心

center:计算整个组件的中心,可能不在模型内部

步移工具:(在全局坐标下使用)按单位长度移动

(快捷键是 ctrl)

四、正式开发案例


tips:

  • 可以创建一个空物体,用来存放各个物件,便于整理
  • 可以选中每个物件,在物件各个组件的右上角可以选中 reset 使得各属性恢复到默认值

1.材质

通过render组件来控制物体的渲染效果,即外观;

render 组件通过 material组件来控制材质;

材质包含 颜色、贴图、和shader

物件属性组件中的 mesh表示网格

2.游戏引擎作用

底层包含渲染引擎(openGL,dx)--------------------------- 只负责把线和图形画在屏幕上

unity 引擎 -------------------------------------------------------------- 可以用来判断物理相关的逻辑(例如碰撞检测)

3.rigidbody组件

给物体添加刚体组件

可以让物体产生重力等物理性质

4.script组件

让物体动起来

通过c#代码让小球动起来


关联C#步骤:

1.设置 rigidbody 变量

2.获取组件,赋值给变量

3.控制组件(施加一个向右的力)


代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class player : MonoBehaviour
{
public Rigidbody rd;
// Start is called before the first frame update
void Start()		//开始运行一次
{
    Debug.Log("游戏开始了");
    rd = GetComponent<Rigidbody>();
}

// Update is called once per frame
void Update()		//始终运行
	{
    rd.AddForce(Vector3.right);		//添加向右的力
	}
}

上述代码中,rd.addforce(vector3.right)表示在三维向量中向右施加一个力

还可将right 更改为 left up down forward back

也可指定任意方向 --------------- 例如:要向( 1 , 2 , 3 )方向,则指定方法为

rd.Addforce( new Vector3( 1 , 2 , 3) );

5.键盘控制


步骤:

1.监听键盘

2.根据键盘按键来控制运动


代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class player : MonoBehaviour
{
public Rigidbody rd;
// Start is called before the first frame update
void Start()
{
    Debug.Log("游戏开始了");
    rd = GetComponent<Rigidbody>();
}

// Update is called once per frame
void Update()
{
    //  rd.AddForce(Vector3.right);
    float x = Input.GetAxis("Horizontal");
    float z = Input.GetAxis("Vertical");

    rd.AddForce(new Vector3(x,0,z));
}
}

解释:

之所以 GetAxis(“Horizontal”) 能获得水平方向轴的信息是因为可以系统设置的原因

可以在edit -> projectsetting -> inputmanager -> axes 中查看所有轴的信息

也可以自己添加多个字符


6.控制相机跟随

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

public class followcrema : MonoBehaviour
{
public Transform playertransform ;
private Vector3 offset;	//该处设置偏移量(全局变量)
// Start is called before the first frame update
void Start()
{
    offset = playertransform.position - transform.position;//此处的 transform 组件表示的是相机的位置,playertransform表示的是小球的位置
}

// Update is called once per frame
void Update()
{
    transform.position = playertransform.position - offset;
}
}

该脚本应添加进 主相机 组件。

7.设置墙体

创建 cube 物体,添加墙的材质

设置墙的旋转角度以及墙的位置

8、预制体(prefab)

提前创建一个模板,用于后续改变每一个实例的样式

也可以通过改变每一个实例的样式,进而应用到所有实例

<–预制体和实例的关系 可以类比于 对象和实例的关系–>

9.控制小球旋转

通过添加脚本使得小球旋转

void Update()
{
    transform.Rotate(Vector3.up); //物体绕三维向量的上方旋转,每秒钟旋转60°,施加乐一个向上的力
}

10.吃掉食物并反馈结果

碰撞检测

步骤:

  1. 碰撞检测,检测二者是否发生碰撞
  2. 碰撞成功后给予反馈(加分、销毁食物)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class player : MonoBehaviour
{
    public Rigidbody rd;
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("游戏开始了");
        rd = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //  rd.AddForce(Vector3.right);
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        rd.AddForce(new Vector3(x,0,z) * 1);
    }

    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("发生碰撞了");

        if (collision.gameObject.tag == "food") //此处的 gameobject 也可替换成 collider ,即既可以通过游戏物体来获取标签,也可以通过组件来获取标签
        {
            Destroy(collision.gameObject);
        }
    }
}

碰撞检测的状态不仅仅只包含 onCollisionEnter (碰撞发生),同时还包含 onCollisionStay (碰撞进行)、onCollisionExit (结束碰撞)。

使用方式相同。

触发检测

步骤:

  1. 先在物体的 collider 组件中勾选上 is Trigger 选项,将物体变成一个触发器
  2. 触发检测,检测二者是否接触
  3. 接触结束后给予反馈(加分、销毁食物)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class player : MonoBehaviour
{
    public Rigidbody rd;
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("游戏开始了");
        rd = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //  rd.AddForce(Vector3.right);
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        rd.AddForce(new Vector3(x,0,z) * 1);
    }
    
//触发检测,如果是与标签为食物的游戏物体相撞的话则销毁该游戏物体
private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "food") {
            Destroy(other.gameObject);
        }
    }
}

此处的 OnTriggerEnter 表示进入触发区域,OnTriggerStay 则表示停留在触发区域中,OnTriggerExit 则表示离开触发区域。


拓展:

可以通过名字 或 标签来判断碰撞、触发的是哪一类

物体的名字和标签都可以一样。(标签在物体名字的下方,可以自己添加)


11.创建游戏UI

创建一个文字框

步骤:create -> UI -> text

将游戏场景切换成 2d,即可对文字框进行操作


思路:
显示分数,并且当小球碰到食物后实时更新分数值。


代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class player : MonoBehaviour
{
    public Rigidbody rd;
    public int score = 0;
    public Text scoretext;

    void Start()
    {
        Debug.Log("游戏开始了");
        rd = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //  rd.AddForce(Vector3.right);
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        rd.AddForce(new Vector3(x,0,z) * 1);
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "food") {
            Destroy(other.gameObject);
            score++;
            scoretext.text = "分数:" + score;
        }
    }
}
解释:
  • 要调用 UI 相关组件,必须先引入 UnityEngine.UI 库

  • 提前设置一个 int 变量,用来实现分数增加

  • 实时更新分数,将文本物体拖拽到 player 组件的 textscore 中,通过 “ scoretext.text = “分数:” + score ” 来更改文本框显示的内容;

  • 将文本框固定于右上角,点击文本框,切换2d,选中定位图标,按住 alt ,选择右上角。

  • 创建 文本UI后能在物件里面发现多了两个游戏物体,一个是 Canvas,表示画布,以后创建 UI 组件即可在该画布里面继续创建;另一个是 EventSystem 则表示发生的事件。

12.结算胜利

思路:当食物吃完,即分数达到时,显示胜利UI

步骤:创建文字UI,显示胜利 -> 消除游戏物体 —> 设置 gameobject 变量,分数文本变量 -> 拖拽将胜利文本赋值给文本变量 -> 当分数足够时,设置物体的显示状态为true

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class player : MonoBehaviour
{
    public Rigidbody rd;
    public int score = 0;
    public Text scoretext;
    public GameObject wintext;		//定义游戏物体变量,设置胜利文字是否显示
    void Start()
    {
        Debug.Log("游戏开始了");
        rd = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //  rd.AddForce(Vector3.right);
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        rd.AddForce(new Vector3(x,0,z) * 1);
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "food")
        {
            Destroy(other.gameObject);
            score++;
            scoretext.text = "分数:" + score;

            if (score == 9) 
            {
                wintext.SetActive(true);		//设置游戏物体状态
            }
        }
    }
}

五、游戏打包

选择 file -> build setting -> 选择平台 -> 添加场景 -> build

六、查询官方文档

选择help中的 manual 或 scripting api

( 两者并没有特别的不同,api 更强调每一个方法的功能,manual 是一个小型的官方文档)

UGUI

一、含义

  • 游戏的开始菜单

  • RPG游戏的菜单栏,侧边栏和功能栏 例如:背包系统、人物列表

  • 用于控制移动的虚拟杆和攻击按钮

二、开始界面案例

1.基本组件(按钮、画布)

​ 创建 canva画布,在画布中创建button、slider、toggle 等组件

​ 并可以在组件中修改相关属性。

2.可滚动查看的公告

	创建 image 组件  ->  将文字内容放在图片组件中 ->  给图片添加 scroll rect 组件 ->  将文字组件拖到 content 中 

由此可实现文字拖动功能。

注:

  • 同时也可以在 scroll rect 中设置水平方向和垂直方向的滚动。
  • 添加 mask 组件可让超出边界的部分隐藏。可在mask组件里面取消勾选 show mask graphic ,使得取消背景图片。

添加 scrollbar组件,来添加滚动条,调整direction的方向,并将该组件绑定到 scroll rect 中的垂直方向。

3.按下按钮实现场景跳转

步骤:

  1. 创建一个空物体,命名为 GameManager

  2. 给该组件添加一个新的脚本,命名为GameManager

  3. 通过vs打开该脚本,创建函数onStartGame

    ​ 代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Gamemanager : MonoBehaviour
    {
        public void onStartGame(string sceneName) {
            Application.LoadLevel(sceneName);   
        } 
    }
    

  4. 在开始按钮中添加事件,拖拽Gamemanager组件到On click 的前面,在后面选择函数Onstartgame ,并内容改成待跳转的场景。使得当点击该按钮时则跳转到下一个场景。

  5. 最后还需点击file -> build setting ,将场景添加到里面去,即可

4.实现控制方块旋转

创建 slider 组件,绑定slider与方块的速度。

绑定方法:在slider中设置最大和最小值,添加事件,选择函数changespeed

代码如下:

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

public class rollcube : MonoBehaviour
{
    public float speed = 90;
    void Update()
    {
        transform.Rotate(Vector3.up * Time.deltaTime * speed);		//设置速度,并让小球旋转
    }

    public void ChangeSpeed(float NewSpeed) {
        this.speed = NewSpeed;							//改变速度
    }
}
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值