【樱酱の小课堂】罗布乐思游戏开发白皮书第二弹:你知道吗?这些活罗布乐思也能整!

最近发现了一个宝藏频道——Mix and Jam
这老厉害了,手把手教你怎么还原一些经典游戏的动效、玩法、关卡设计~
*木有科学上网条件的小伙伴可以看这里:Mix and Jam

当时小樱看到的表情是这样的:
image

同时呢,我也终于想好第二弹做啥了!
:crazy_face:么错,观众老爷们,我要在罗布乐思Studio上做同样的骚操作
image

【本贴会持续更新,喜欢记得三连!】
(拒绝下次一定, 人人有责)

第一波:选关界面
先尝试实现简单的功能吧——马里奥:奥德赛-世界选关界面


看看最终效果:


是不是很酷炫咧~
下面接单介绍一下实现这个选关界面的方法:

  • 实现逻辑
  1. 解锁摄像头
    在罗布乐思Studio中,摄像头的位置默认是跟随虚拟形象的,我们需要将它解锁:camera.CameraType = Enum.CameraType.Scriptable

  2. 设置地球模型
    建立一个球形网格,在工具箱里面挑选合适贴图,然后将贴图的ID输入“属性"下的”TextureID“栏目。
    (当然如果你懒,也可以直接在工具箱拉一个出来 :crazy_face:

  3. 设置世界关卡位置
    就是一个个红色的球球,直接拉部件放置在合适的位置即可!

  4. 设置GUI位置
    在StarterGUI项目下面建立ScreenGUI,建立Frame,按需添加Textbutton。随后,通过在Textbutton下建立imagelabel和Textlabel实现选中态的红点和圆角矩形框。

  5. 通过点击GUI发送指令命令摄像头跟随关卡卷动
    控制摄像机位置以及控制摄像机缓慢移动到设定好的位置和方向,朝向和位置可以用CFrame来设定,
    local target = CFrame.new(beginPos.Position+cameraOffest,beginLookAt.Position+cameraOffest)

    移动效果可以用TweenService实现:

    local rotate = function()
    – 设置并开始旋转过渡
    – EasingStyle确定TweenService补间的作用方式Linear是平滑的
    – EasingDirection可以设置补间的方向前半段慢还是后半段慢或者前慢,中间快,后面慢
    – 创建一个新的渐变(时间,以恒定速度移动 ,缓动风格前半段向前应用,后半段向后应用 是否一直转,0转一圈,1转2圈,-1一直转
    local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Sine, Enum.EasingDirection.Out, 0)
    –创建一个新的 Tween(渐变)效果。该函数需要三个参数:获取该效果的对象、所使用的 TweenInfo、以及包含了将进行渐变的属性和其目标值的表。
    local tween = TweenService:Create(camera, tweenInfo, {CFrame=target})
    –Completed只会在tween函数完成或者TweenBase:Cancel停止时候触发。
    tween.Completed:Connect(function()
    –tweenComplete = true
    end)
    –播放Tween动画只会播放一次
    tween:Play()
    end

就是酱啦,是不是非常简(fan)单(suo)呢~
欢迎在评论区留言交流一哈~

第二波:选关界面
这次尝试整个大炮!拉出我的意大利炮,开火!


看看最终效果:
https://www.bilibili.com/video/BV1yP4y1a7FW/

  • 实现逻辑:

    1.把人物设置为第一人称视角
    player.CameraMode = Enum.CameraMode.LockFirstPerson

    2.从工具箱拉一个喜欢的枪械模型放入背包(删除里面的脚本)

    3.武器上下瞄准
    人物装备武器时无法瞄准上方和下方
    local toMouse = (mouse.Hit.Position - head.Position).unit
    local angle = math.acos(toMouse:Dot(Vector3.new(0, 1, 0)))
    local neckAngle = angle
    UpperTorso.C0 = CFrame.new(0,0,0)*CFrame.Angles(math.pi/2 - neckAngle,0,0);

    4.根据鼠标按下的时间决定凝聚光束和子弹大小
    子弹大小:Activated方法触发后使用一个变量来记录按下的时间,根据 当前时间-按下的时间 来设置子弹的大小
    if time() - DownClick <= 0.5 then
    bullet.Size = bullet.Size + Vector3.new(0.005,0.005,0.005);
    return;
    end

      	if time() - DownClick <= 0.8 then
      		bullet.Size = bullet.Size + Vector3.new(0.005,0.005,0.005);
      		return;
      	end
      	if time() - DownClick <= 1 then
      		bullet.Size = bullet.Size + Vector3.new(0.05,0.05,0.05);
      	end
      光束:在子弹下添加BillboardGui,在按下鼠标一定时间后生成一些imagelabel,设置image的图片和大小
      	local s = math.random();
      	local image = Instance.new("ImageLabel");
      	image.Parent = frame;
      	image.BackgroundTransparency = 1;
      	image.Image = "rbxassetid://291537647";
      	image.AnchorPoint = Vector2.new(0.5,0.5);
      	image.Size = UDim2.new(s/8,0,s/8,0);
      	image.Position = UDim2.new(math.random(),0,math.random(),0);
      	A = Vector2.new(0.5,0.5);
      	B = Vector2.new(image.Position.X.Scale,image.Position.Y.Scale);
      	image.Rotation = getAngleByPos(A,B);
      	image.ImageTransparency = 1/30;
      	if image.Rotation >= 15 and image.Rotation <= 90 then image:Destroy(); end
    

    5.检测子弹的碰撞,根据子弹大小来决定是否产生爆炸
    在子弹中写Touched事件,对bullet大小判断,大于某一值发生爆炸
    if part.Size.X <= 0.65 then part:Destroy(); return end
    local boom = Instance.new(“Explosion”);
    boom.Parent = game.Workspace;
    boom.Position = part.Position;
    part:Destroy();

大功告成,这样就可以在游戏里实现蓄力biubiubiu的效果啦!
欢迎在评论区留言交流两哈~

5 个赞

雀食蟀 :+1: :+1: :+1: :+1: :+1:

厉害了!!!!!!

关于我们    加入我们    条款    隐私政策
©2021 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。
粤ICP备20013629号