C#初中级实战—3DFlipBird(二)

替换美术资源

用blender与MagicaVoxel制作美术资源,导入到unity中,替换原本的方块与胶囊体,地面扩大
在这里插入图片描述
制作方法:用blender雕刻功能雕刻出bird,拓扑,展UV,画笔功能画贴图(见blender学习博客)
替换的时候,只需要将对应模型,放在胶囊体下面,然后将胶囊体的mesh renderer取消勾选或者,移除此脚本即可,这样的替换美术资源的方法不易产生错误(不需要动代码,物体的脚本结构也没有发生变化)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
还可以调整Collider的大小与模型去匹配,这样可以使碰撞更加贴合(可以添加多个Collider,搭建与模型匹配的Collider)
在这里插入图片描述

更换天空盒

在unity商店中找了一个免费的天空盒
在这里插入图片描述
更换方法:下载导入,然后在lighting setting中的environment处修改天空盒。
在这里插入图片描述
在这里插入图片描述

对unity中的文件进行归类

在这里插入图片描述
unity中有一些特殊文件夹,当我们导入不同的资源时,有一些要放到特殊文件夹中。一般来说Editor和Resources这两个文件夹是必须的,剩下的按需求添加。美术资源也全部放到Resources这个文件夹里面。

1.Editor

Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以。比如目录:/xxx/xxx/Editor
和 /Editor
是一样的,无论多少个叫Editor的文件夹都可以。Editor下面放的所有资源文件或者脚本文件都不会被打进发布包中,并且脚本也只能在编辑时使用。一般呢会把一些工具类的脚本放在这里,或者是一些编辑时用的DLL。
比如我们现在要做类似技能编辑器,那么编辑器的代码放在这里是再好不过了,因为实际运行时我们只需要编辑器生成的文件,而不需要编辑器的核心代码。

2.Editor Default

Editor Default注意中间是有空格的,它必须放在Project视图的根目录下,如果你想放在/xxx/xxx/Editor Default
这样是不行的。你可以把编辑器用到的一些资源放在这里,比如图片、文本文件、等等。它和Editor文件夹一样都不会被打到最终发布包里,仅仅用于开发时使用。

3.Gizmos

我觉得这个文件夹其实没什么用处,它可以在Scene视图里给某个坐标绘制一个icon,很多的插件就需要用的Gizmos(比如playmaker)。它的好处是可以传一个Vecotor3 作为图片显示的位置。

4.Plugins

如果做手机游戏开发一般 andoird 或者 ios
要接一些sdk 可以把sdk依赖的库文件 放在这里,比如 .so
.jar .a 文件。这样打完包以后就会自动把这些文件打在你的包中。

5.Resources

可以在根目录下,也可以在子目录里,只要名子叫Resources就可以。比如目录:/xxx/xxx/Resources
和 /Resources
是一样的,无论多少个叫Resources的文件夹都可以。Resources文件夹下的资源不管你用还是不用都会被打包进.apk或者.ipa
Resource.Load :编辑时和运行时都可以通过Resource.Load来直接读取。
Resources.LoadAssetAtPath()
:它可以读取Assets目录下的任意文件夹下的资源,它可以在编辑时或者编辑器运行时用,它但是它不能在真机上用,它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。
AssetDatabase.LoadAssetAtPath():它可以读取Assets目录下的任意文件夹下的资源,它只能在编辑时用。它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。
我觉得在电脑上开发的时候尽量来用Resource.Load() 或者
Resources.LoadAssetAtPath() ,假如手机上选择一部分资源要打assetbundle,一部分资源Resource.Load().那么在做.apk或者.ipa的时候
现在都是用脚本来自动化打包,在打包之前
可以用AssetDatabase.MoveAsset()把已经打包成assetbundle的原始文件从Resources文件夹下移动出去在打包,这样打出来的运行包就不会包行多余的文件了。打完包以后再把移动出去的文件夹移动回来。

6. StreamingAssets

这个文件夹下的资源也会全都打包在.apk或者.ipa
它和Resources的区别是,Resources会压缩文件,但是它不会压缩原封不动的打包进去。并且它是一个只读的文件夹,就是程序运行时只能读不能写。它在各个平台下的路径是不同的,不过可以用Application.streamingAssetsPath
它会根据当前的平台选择对应的路径。
有些游戏为了让所有的资源全部使用assetbundle,会把一些初始的assetbundle放在StreamingAssets目录下,运行程序的时候在把这些assetbundle拷贝在Application.persistentDataPath目录下,如果这些assetbundle有更新的话,那么下载到新的assetbundle在把Application.persistentDataPath目录下原有的覆盖掉。
因为Application.persistentDataPath目录是应用程序的沙盒目录,所以打包之前是没有这个目录的,直到应用程序在手机上安装完毕才有这个目录。
StreamingAssets目录下的资源都是不压缩的,所以它比较大会占空间。

Hierarchy窗口整理

对场景中的文件进行分类,建立若干个空物体,改名。
在这里插入图片描述
文件太多的话,还可以建立空物体,改名分隔符进行分类
在这里插入图片描述

对bird添加左右移动的代码

添加一个检测左右移动的函数,此函数用两个if来判断是否按下键盘上 左右移动的键,如果按下就添加对应方向的力(如果是修改速度,会出现先添加的失灵的现象,可以打印对应的“left”or“right”但是只有后添加的速度生效,无法解决,只能添加力)
小细节1:else保证了停止按键时,bird不会继续移动
小细节2:最后一个else中,Z轴速度为0,保证了bird被碰撞之后,bird不会一直往后移动(一个力添加后再被消除,速度不会消失,Y方向有重力保证物体会下坠,Z方向如果不清零速度,bird被碰撞后会一直往后移动)

public class BirdBase : MonoBehaviour
{
    public Rigidbody rigBird;
    public float jumpForce;
    public float moveForce;

    public string jumpKey;
    public string rightKey;
    public string leftKey;

    // Start is called before the first frame update
    private void Start()
    {
    }

    // Update is called once per frame
    private void Update()
    {
        if (Input.GetKeyDown(jumpKey))
        {
            BirdJump();
        }

        RighAndLeftMove();
    }

    public void BirdJump()
    {
        rigBird.AddForce(new Vector3(0, jumpForce, 0));
    }

    public void RighAndLeftMove()
    {
        if (Input.GetKey(leftKey))
        {
            rigBird.AddForce(new Vector3(-moveForce, 0, 0));
            Debug.Log("left");
        }
        else
        {
            rigBird.velocity = new Vector3(0, rigBird.velocity.y, rigBird.velocity.z);
        }
        if (Input.GetKey(rightKey))
        {
            rigBird.AddForce(new Vector3(moveForce, 0, 0));
            Debug.Log("right");
        }
        else
        {
            rigBird.velocity = new Vector3(0, rigBird.velocity.y, 0);
        }
    }
}
此函数需要3个参数,一个左右移动的力,两个按键。
 public float moveForce;
 public string rightKey;
 public string leftKey;

添加物体随机产生的代码

在之前的代码中,物体只能产生在随机位置,如果我们有多个需要产生的物体,需要让位置和物体都进行随机。
比如我们有3种需要躲避的树,进行随机产生。
在这里插入图片描述
方法1:使用多个Gameobject添加,然后按照位置随机的方法,使用random随机数,然后根据数字的不同,实例化不同的树。
但是这样做有两个弊端,
一是我们不能在运行时,根据难度动态添加障碍物的种类(其实也可以,事先用gameobject定义好,然后根据time的增加对random数进行修改,使得可以将随机范围扩大)
二是写起来重复度很高,而且不易修改,每多一个障碍物,就要去修改代码。

方法2:我们用一个list表来存放障碍物,随机数就随机0-list的长度,然后直接在对应位置实例化随机数,随机出来的下标物体即可
打开我们的GameMager代码:
在这里插入图片描述
添加一个list,然后将创造方法中的物体替换成如图的 随机下标物体
在这里插入图片描述
完整代码:

public class GameMager : MonoBehaviour
{
    public Transform onePosition;
    public Transform twoPosition;

    public Transform threePosition;
    public List<GameObject> creatGameObject;
    


    public float creatTime;
    private float timeTemp;
    private int creatNumber;

    // Start is called before the first frame update
    void Start()
    {
        timeTemp = creatTime;
        creatNumber = creatGameObject.Count;

    }

    // Update is called once per frame
    void Update()
    {
        RangeCreat();
        creatTime -= Time.deltaTime;
        

    }

    public void Creat(GameObject gameObject,Transform position)
    {


        Instantiate((gameObject), position);


    }

    public void RangeCreat()
    {
        if (creatTime <= 0)
        {
            float ranPTemp = Random.Range(1, 4);//达不到最大值
            int ranCTemp = Random.Range(0, creatNumber);

            Debug.Log(ranPTemp);
            if (ranPTemp == 1)
            {
               
                Creat(creatGameObject[ranCTemp],onePosition);


            }
            else if (ranPTemp == 2)
            {
                Creat(creatGameObject[ranCTemp], twoPosition);


            }
            else if (ranPTemp == 3)
            {
                Creat(creatGameObject[ranCTemp], threePosition);


            }
            creatTime = timeTemp;

        }
    }

}

现在我们的3DFlipBird已经基本能玩了,下一步就是添加分数面板,以及开始界面,死亡界面。
项目地址:
https://github.com/euphoriaer/3DBird.git
请下拉0.1版本,使用的的是unity2019.4.0f1
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值