使用Unity3D做一个伪3D游戏吧!(1)

    本篇小型实例是为像本渣渣一样刚刚入门U3D的童鞋们制作的,当然理论上包括了设计一部完整游戏的主要内容,而不是单纯的讲某些函数怎么使用

                            ——也就是说,大部分API里面使用频率高的内容并不会详细解释,并且对于游戏不会进行比较高效的优化

    那么开始吧!

        在某个遥远的二维世界里,有一个正方形——我们姑且叫它“方块君”,方块君的宿敌是五边形君,因为——

                啊~~~五边~~~你比四边多一边~~~

        什么鬼,emmmmm,你只需要记住这个事实就可以辣

        但是方块君没有能够击败五边形君的力量,于是它向卡密撒嘛求助,卡密撒嘛告诉它,它可以许下一个愿望,获得某种能力,但是五边形君们也能获得同样的能力,于是方块君考虑再三,决定向神所要移动和攻击的能力什么原来方块君是不会动的吗  什么你不写脚本方块君能动吗

    于是,这部脑子一热突发奇想的垃圾游戏就诞生了(由于压根没有什么美术资源又懒得去AssetsStore找,所有的东西都是几何图形拼成的):

        

你没有看错就是这么简单

于是乎,方块君怒了:你不就是把我放在一个梯形里面吗!

卡密撒嘛:别急嘛,之后你就能享受到“民主自由”的感觉了,等我敲个代码……将这些扔进FixedUpdate()里面就行辣

        if (Input.GetKey(KeyCode.LeftArrow)&&transform.position.x>=-8f)//按住左方向键并限制范围
        {
            transform.Translate(Vector2.left* Time.deltaTime*5f);
        }
        if (Input.GetKey(KeyCode.RightArrow)&&transform.position.x<=8f)//右方向键
        {
            transform.Translate(Vector2.right* Time.deltaTime*5f);
        }

这样也就实现了方块君的左右移动

但是方块君还不知足:光扭扭腰怎么行,我还得会飞,会时空折跃……教练我想学

卡密:滚犊子,我也想学,那就随便给你做一个“跳跃”吧!

懒惰是第一生产力,计算机图形学第一大定律——只要他看起来是对的,那么他就是对的,方块君的跳跃也可以用transform.Translate()进行模拟:

我们先定义两个状态:

public bool canJump = true, jumping;//是否可以起跳,是否正在跳跃

再定义一个浮空时间:可以根据个人喜好修改,如果是正无穷……恭喜方块君你会飞啦(当然原理其实不是这样的)

public float jumptime = 0.5f;

之后我们写一个跳跃函数!?怎么看起来这么辣鸡

void jump()
    {
        if (canJump)//如果能跳
        {
            canJump = false;//那么不能跳
            jumping = true;//那么正在跳
            jumptime = 0.5f;//那么重新设置跳跃时间
        }
    }

别急,真正的大头是要放在FixedUpdate()里面的:

if (transform.position.y <= -2f)//如果方块君在“地面”
        {
            canJump = true;//那么它可以再次起跳
        }
        if(Input.GetKey(KeyCode.UpArrow)){//如果按下上方向键
            jump();
        }
        if(jumping){//如果正在跳
            if(jumptime>0.375f){将时间分为三部分:上升,滞空,下降,比例理论上是1:2:1(当然你也可以按自己的喜好来)
                transform.Translate(Vector2.up * Time.deltaTime * 8f);
            }else if(jumptime<=0.15f&&jumptime>=0f){//这里是一个玄学的地方,本来应该是jumptime<=0.125f,但是这样会导致方块君回不到原来高度
                transform.Translate(Vector2.down * Time.deltaTime * 8f);
            }
            jumptime -= Time.deltaTime;//计时器
        }
        if(jumptime<=0){//跳完啦
            canJump = true;//恢复原来的设定
            jumping = false;
        }

那么我们还是对里面相关的东西进行解释:

    ·常数们:

            由于我们做的只是一个单场景小游戏,所以很多功能还是使用常数效率更高,比如对移动距离的判定:

            

所以横坐标绝对值不超过8

     ·对于“跳跃”:

            可以发现,如果一直按住上方向键,方块君的跳跃是有周期的,也就是说,一直按住该按键,呈现的是这样的一个函数图像

其中,y轴表示方块君跳起的高度,x轴表示时间,各位可以看一下方块君起跳的速度应该是8个单位每秒,在落地之后又可以再次起跳

我们通过计时器来进行这样的设计:

    简单来说:一旦时间达到设定值,就可以执行一次操作,并且重设时间


    所以,方块君的第一个愿望终于满足辣,接下来我们还会设计新操作让方块君可以射出子弹,拭目以待吧——当然对于大佬们根本不是什么问题吧……自己也要继续努力啊(懒得优化是病得治——虽然认真做项目的时候肯定会优化的辣)


啊啊啊不行写得好烂啊,求各位大佬可以指正一下啊啊啊

毕竟第一次写比较(专业?)的blog咩

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,这是一个简单的三国游戏,玩家需要在三国中完成一些任务和战斗,最终成为三国的霸主。 首先,我们需要引入一些必要的库: ```python import random import time ``` 然后,我们定义一些游戏中需要用到的变量和函数: ```python # 游戏中的角色 players = { 'player': {'name': '你', 'hp': 100, 'power': 20}, 'enemy': {'name': '敌人', 'hp': 100, 'power': 20} } # 战斗函数 def fight(player1, player2): while player1['hp'] > 0 and player2['hp'] > 0: # 玩家1攻击玩家2 player2['hp'] -= player1['power'] print(f"{player1['name']}攻击了{player2['name']},{player2['name']}剩余{player2['hp']}点生命值") # 玩家2攻击玩家1 if player2['hp'] > 0: player1['hp'] -= player2['power'] print(f"{player2['name']}攻击了{player1['name']},{player1['name']}剩余{player1['hp']}点生命值") if player1['hp'] > 0: print(f"{player1['name']}战胜了{player2['name']}") return True else: print(f"{player2['name']}战胜了{player1['name']}") return False ``` 接下来,我们定义游戏中的场景和任务: ```python # 场景1:黄巾起义 def huangjin(): print("这是黄巾起义的场景,你需要打败黄巾军") if fight(players['player'], {'name': '黄巾军', 'hp': 80, 'power': 10}): print("恭喜你,打败了黄巾军!") return True else: print("很遗憾,你输了") return False # 场景2:官渡之战 def guandu(): print("这是官渡之战的场景,你需要打败曹操的军队") if fight(players['player'], {'name': '曹军', 'hp': 100, 'power': 15}): print("恭喜你,打败了曹军!") return True else: print("很遗憾,你输了") return False # 场景3:赤壁之战 def chibi(): print("这是赤壁之战的场景,你需要打败陆逊的军队") if fight(players['player'], {'name': '陆军', 'hp': 120, 'power': 20}): print("恭喜你,打败了陆军!") return True else: print("很遗憾,你输了") return False # 任务1:拜访刘备 def liubei(): print("你需要前往刘备的营地拜访他") time.sleep(1) # 模拟时间 print("你成功拜访了刘备,他给你赠送了一把宝剑") players['player']['power'] += 10 # 任务2:寻找赵云 def zhaoyun(): print("你需要寻找赵云") time.sleep(1) # 模拟时间 print("你找到了赵云,他加入了你的队伍") players['player2'] = {'name': '赵云', 'hp': 80, 'power': 25} ``` 最后,我们将场景和任务组合在一起,实现游戏的整体流程: ```python # 游戏流程 print("欢迎来到三国世界!") time.sleep(1) # 模拟时间 # 场景1 if huangjin(): liubei() # 场景2 if guandu(): # 任务1 liubei() # 场景3 if chibi(): # 任务2 zhaoyun() print("恭喜你成为了三国的霸主!") else: print("你输了") else: print("你输了") else: print("你输了") ``` 这样,一个简单的三国游戏就完成了。当然,你可以根据自己的喜好和能力,添加更多的场景和任务,让游戏更加丰富有趣。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值