IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity学习记录 -> 正文阅读

[游戏开发]unity学习记录

学习目标:入手unity并制作第一款独立游戏

一、建模及基本组件

在这里插入图片描述

  • Materials:存放材质Material的文件夹,将材质拖动到模型上即可附加,其中添加了Rigidbody刚体材质到小球Player上
  • Scenes:场景
  • Scripts:存放c#代码的文件夹
  • Packages:自带的组件包
  • Local/Global切换可以切换控制实体坐标轴
    在这里插入图片描述
  • Project Settings->Input Manager 包含键盘及鼠标输入相应的行为

二、学习代码记录

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

public class Player : MonoBehaviour
{
    // Start is called before the first frame update
    public Rigidbody rd;//创建一个公有Rigidbody对象
    //私有的在unity面板上看不到


    void Start()//游戏启动后运行的部分
    {
        Debug.Log("Hello world!");
        //打印 输出 显示 日志
        rd = GetComponent<Rigidbody>();//将rd实例化,
        //即把Player和rd对应起来建立连接,
        //同时用拖拽"Player"或者"Rigidbody"的方式也是等效的
    }

    // Update is called once per frame
    void Update()//游戏开始后一直运行的部分
    {
        Debug.Log("World is helloing!");
        rd.AddForce(Vector3.right);//赋予一个向右的力默认为1N
        //亦即模型中为(1,0,0)的向量
        rd.AddForce(Vector3.left);
        rd.AddForce(Vector3.forward);
        rd.AddForce(Vector3.back);
        rd.AddForce(Vector3.up*10);//10牛顿
        rd.AddForce(Vector3.down);
        rd.AddForce(new Vector3(0, 0, -1));//创建一个向量

        float h = Input.GetAxis("Horizontal");
        //创建一个对象h 监控键盘输入,控制水平
        float h = Input.GetAxis("Vertical");
        //垂直,即前后
        Debug.Log(h);
        //运行时按下a或left,值从0递减至-1,
        //d或right从0渐变到-1        
	    rd.AddForce(new Vector3(h, 0, v));
}
}

三、控制相机跟随移动

在这里插入图片描述

  1. 给Main Camera添加FollowTarget脚本,用来跟随物体移动
  2. 在代码中Vector3创建一个距离差对象offset,设置为私有全局变量
  3. Transform创建一个playertransform对象获取player坐标位置
  4. transfrom可以直接得到此脚本对应的组件位置
  5. 代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowTarget : MonoBehaviour
{
    public Transform playertransform;
    private Vector3 offset;
    //创建距离对象
    // Start is called before the first frame update
    void Start()
    {
        offset = transform.position - playertransform.position;
        //transform.position获取MainCamera位置
        //playertransform.position获取小球位置
        //拖拽的方式将小球与playertransform配对
    }

    // Update is called once per frame
    void Update()
    {
        transform.position = playertransform.position + offset;
        //注意这里是+,我一开始是-,游戏开始后相机会固定在平台下方
    }
}

四、场景布置

在这里插入图片描述

  • 预制体,类似于类的概念
  1. 创建4个Cube实体作为墙,改变长度和位置使之置于平台四个边上
  2. 创建食物Food
  3. 创建预制体文件夹Prefabs,将Food拖入其中,预制体即创建完成
    在这里插入图片描述

在这里插入图片描述

  1. 控制Food旋转
  2. 添加脚本Food
  3. transform.Rotate(Vextor.up);//默认一秒执行60次,即一秒旋转60度
  4. 文档查阅操作如下在这里插入图片描述也可以登录unity.cn查看中文文档
    在这里插入图片描述
  5. 旋转脚本代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Food : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(Vector3.up);
        //默认一秒执行60次,即一秒旋转60度
    }
}

五、碰撞检测

  1. player.cs中创建系统事件
  • 碰撞的三种状态:Enter,Stay,Exit
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("发生碰撞 OnCollisionEnter");
    }
    private void OnCollisionExit(Collision collision)
    {
        Debug.Log("发生碰撞 OnCollisionExit");
    }
    private void OnCollisionStay(Collision collision)
    {
        Debug.Log("发生碰撞 OnCollisionStay");
    }

在这里插入图片描述

  1. Food添加 Food 标签,便于区分物体
    在这里插入图片描述
  2. 碰撞判断语句,碰撞器检测到碰撞物体后判断其tag,若为真,物体销毁
        if(collision.gameObject.tag=="Food")
        {
            Destroy(collision.gameObject);
        }
  1. 碰撞检测弊端:画面会产生碰撞的效果后物体才会消失,吞并食物效果不连贯

六、触发检测

  • 触发器本身是碰撞器,只是不会产生碰撞效果
  1. 将物体的碰撞器部分中的"Is Trigger"勾选上,表示物体拥有触发器属性
    在这里插入图片描述

  2. 勾选后player能对Test物体穿模
    在这里插入图片描述

  3. 触发器出发状态代码如下:

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("OnTriggerEnter");
    }
    private void OnTriggerExit(Collider other)
    {
        Debug.Log("OnTriggerExit");
    }
    private void OnTriggerStay(Collider other)
    {
        Debug.Log("OnTriggerStay");
    }

在这里插入图片描述

  1. 触发器代码:直接other.tag,和collision.gameObject.tag不一样,当勾选触发器属性后,碰撞方法内就不会执行
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("OnTriggerEnter");
        if(other.tag=="Food")
        {
            Destroy(other.gameObject);
        }
    }

七、通过UI显示得分

  1. player.cs内定义全局变量score

  2. 新建UI->text,切换2D模式
    在这里插入图片描述

  3. Canvas表示屏幕对应的视角,也是画布
    在这里插入图片描述

  4. EventSystem表示事件

  5. 修改文本位置
    在这里插入图片描述

  6. 引入UI包using UnityEngine.UI;

  7. 定义全局变量Text型scoreTextpublic Text scoreText;将UI的Text拖入player的Score Text内
    在这里插入图片描述

  8. 之后更新UI显示内容ScoreText.text = "得分:"+score;

  9. 显示游戏胜利
    教程中提到的方法:
    1、Canvas中新建Text文件WinText,取消勾选Text属性,即false
    在这里插入图片描述

    2、创建全局变量GameObject类WinText(注:每一个UI组件本质都是GameObject)
    3、游戏中激活WinText的Text属性:WinText.SetActive(true);使Text为真
    4、代码如下:

public GameObject winText;

判定部分:

if (other.tag == "Food")
{
	Destroy(other.gameObject);
	score++;
	scoreText.text = "分数:" + score ;
	if(score == 12)
	{
	    winText.SetActive(true);
	}
}
  • 我敲完这一段代码后运行发现当得分符合判定条件后 “游戏胜利” 字样并没有出现在屏幕中间,对照教程中的代码一行行检查还是不知道问题所在,上网也查找了很多资料还是不知道原因。于是借鉴资料,学会了另一种方法显示游戏胜利。

  • GameObject.Find()
    通过场景里面的名子或者一个路径直接获取游戏对象。
    GameObject root = GameObject.Find(“GameObject”);
    资料来源: 作者:雨松MOMO https://www.xuanyusong.com/archives/2768
    以及Unity3D UI Text文本触发隐藏显示

    public GameObject WinText;
    void Start()
    {
        WinText = GameObject.Find("WinText");
        WinText.SetActive(false);
    }

判定部分:

    if (other.tag == "Food")
    {
        Destroy(other.gameObject);
        score++;
        ScoreText.text = "得分:" + score;
        if (score == 5)
        {
            WinText.SetActive(true);
        }
    }
  • 结果展示:(好耶!)
    在这里插入图片描述

八、游戏打包

  • File->Build Settings,直接将scenes拖进去并选择打包平台后即可打包。打包平台可以在UnityHub中下载

在这里插入图片描述在这里插入图片描述

  • 修改游戏屏幕设置:打包前选择player settings
    在这里插入图片描述在这里插入图片描述

九、加点元素

  • 随机Food生成:(代码部分)
    float times = 3f;
    public Food food;
    void Update()
    {
        times -= Time.deltaTime;
        if (times < 0)
        {
            Food obj = (Food)Instantiate(food);
            int x = Random.Range(-4, 4);
            int z = Random.Range(1, 9);
            obj.transform.position = new Vector3(x, 4247512 / 10000000, z);
            times = Random.Range(0, 5);
        }
    }
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:56:45  更:2021-09-24 10:57:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 4:49:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码