最近发现了一个宝藏频道——Mix and Jam
这老厉害了,手把手教你怎么还原一些经典游戏的动效、玩法、关卡设计~
*木有科学上网条件的小伙伴可以看这里:Mix and Jam
当时小樱看到的表情是这样的:
同时呢,我也终于想好第二弹做啥了!
么错,观众老爷们,我要在罗布乐思Studio上做同样的骚操作!
【本贴会持续更新,喜欢记得三连!】
(拒绝下次一定, 人人有责)
第一波:选关界面
先尝试实现简单的功能吧——马里奥:奥德赛-世界选关界面
看看最终效果:
是不是很酷炫咧~
下面接单介绍一下实现这个选关界面的方法:
- 实现逻辑
-
解锁摄像头
在罗布乐思Studio中,摄像头的位置默认是跟随虚拟形象的,我们需要将它解锁:camera.CameraType = Enum.CameraType.Scriptable
-
设置地球模型
建立一个球形网格,在工具箱里面挑选合适贴图,然后将贴图的ID输入“属性"下的”TextureID“栏目。
(当然如果你懒,也可以直接在工具箱拉一个出来 ) -
设置世界关卡位置
就是一个个红色的球球,直接拉部件放置在合适的位置即可! -
设置GUI位置
在StarterGUI项目下面建立ScreenGUI,建立Frame,按需添加Textbutton。随后,通过在Textbutton下建立imagelabel和Textlabel实现选中态的红点和圆角矩形框。 -
通过点击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.LockFirstPerson2.从工具箱拉一个喜欢的枪械模型放入背包(删除里面的脚本)
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;
endif 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的效果啦!
欢迎在评论区留言交流两哈~