大家好,我是秦培。欢迎关注我的博客。我的博客地址blog.csdn.net/qinyuanpei。

在前面的文章中。我们分别实现了一个自己定义的角色控制器《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》和角色死亡的效果《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色死亡效果实现》。今天我们继续来做点和仙剑相关的东西,首先我们来看一副图:

这幅图呢,是仙剑奇侠传的第一个迷宫场景——仙灵岛的莲花池。

男主角李逍遥为替婶婶求药独闯仙灵岛,在经历了前面的小草妖战斗后,李逍遥就来到了 莲花池,这个迷宫的解法非常easy,乘坐莲花池中的芦苇垫到不同的地方,然后用破天锤打碎五座阿修罗像,通往仙灵岛的通路就会被打开,就是在仙灵岛李逍遥邂逅了正在沐浴的赵灵儿。仙剑奇侠传的故事从此展开。好了。故事先讲到这里,我们来看这里非常重要的一个信息:李逍遥踩着芦苇垫到达不同的地方。然后用破天锤打碎石像开启机关。

我们把终于要的东西提取出来的话就是我们能够踩着芦苇垫子到不同的地方去。好,我们今天就来实现一个简化的"仙灵岛"吧!

那么怎么做呢?不知道大家还记不记得我在《[Unity3D]Unity3D游戏开发之基于ITween实现寻路功能》这篇文章里提到过的寻路方法,在这篇文章中。我们终于实现的效果是这种:

如今呢,让我们把莲花池里的构件做一下抽象:每个 石柱能够看做是一个寻路节点,芦苇垫子能够看做是绑定了寻路组件的一个GameObject。唯一的差别就在于这里的芦苇垫子是须要我们的角色站在上面才干让它运动的。而我们在这篇文章里的游戏体是自己运动的。

好,如今我们開始来实现这个功能吧。我们先创建例如以下图所看到的的场景:

我们在水中布置了8个石柱,两个芦苇垫子,当游戏開始时,玩家控制角色走上芦苇垫子时。芦苇垫子将依照事先设定的路线,将角色送达最后一个石柱位置,此时,玩家能够控制角色到达对岸。

当玩家再次踏上芦苇垫子时,芦苇垫子会将角色送回起点位置。

当芦苇垫子处于移动状态中时,角色能够向四个方向旋转,活动范围仅限于芦苇垫子上。好。交待清楚了场景,我们以下来解说原理:

1、角色控制

採用在《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》中实现的角色控制器来控制角色的行为。

2、寻路的实现

採用在《[Unity3D]Unity3D游戏开发之基于ITween实现寻路功能》中实现的寻路组件作为基础脚本。本节在此基础上做扩充和完好。保证角色能够自由的移动

基于以上两个原理,我们以下来编写今天的脚本:

using UnityEngine;
using System.Collections;public class TransportScript : MonoBehaviour {//寻路组件节点public Transform[] mPaths;//芦苇垫传送器private Transform mTransportor;//被传送的角色public Transform mTransportPlayer;//起点Vector3 StartPoint=new Vector3(0F,0.5F,-13F);//终点Vector3 EndPoint=new Vector3(0F,0.5F,10F);//定义移动的方向类型:从起点到终点为0,从终点到起点为1private int MoveType=0;//定义移动状态的标志变量private bool isMoving=false;//存储寻路组件设置的哈希表private Hashtable args=new Hashtable();void Start () {//获取传送器mTransportor=this.transform;//初始化寻路插件Hashtable args = new Hashtable();//设置路径的点args.Add("path",mPaths);//设置类型为线性,线性效果会好一些。

args.Add("easeType", iTween.EaseType.linear); //设置寻路的速度 args.Add("speed",2.5f); //移动的总体时间。假设与speed共存那么优先speed args.Add("time",10f); //是否先从原始位置走到路径中第一个点的位置 args.Add("movetopath",true); //延迟运行时间 args.Add("delay", 0.1f); //移动的过程中面朝一个点 args.Add("looktarget",Vector3.up); //三个循环类型 none loop pingPong (一般 循环 来回) args.Add("loopType", "pingPong"); //是否让模型始终面朝当面目标的方向 //假设你发现你的模型在寻路的时候时钟都是一个方向那么一定要打开这个 args.Add("orienttopath",true); iTween.MoveTo(gameObject,args); iTween.Pause(); } void Update() { //假设当前处于停止状态则暂停动画 if(isMoving==false) { iTween.Pause(); } //从起点到终点的控制 if(MoveType==0 && mTransportor.position!=EndPoint && isMoving==true) { //未到达终点则继续运动 mTransportPlayer.position=mTransportor.position; }else if(MoveType==0 && mTransportor.position==EndPoint) { //到达终点则暂停运动 iTween.Pause(); isMoving=false; MoveType=1; } //从终点到起点的控制 if(MoveType==1 && mTransportor.position!=StartPoint && isMoving==true) { //未到达终点则继续运动 mTransportPlayer.position=mTransportor.position; }else if(MoveType==1 && mTransportor.position==StartPoint) { //到达终点则暂停运动 iTween.Pause(); isMoving=false; MoveType=0; } } //当角色走上芦苇垫的时候開始移动动画 void OnTriggerEnter(Collider mCollider) { if(mCollider.gameObject.name=="Samuzai") { if(isMoving==false) { isMoving=true; iTween.Resume(); } } } }

在上面的代码中,我们须要把握下面几点:

1、在Start()方法中。我们主要完毕的是寻路组件的初始化,这里我们将寻路动画设置为来回,然后通过Pause()、Resume()方法两个方法来控制动画的播放。由于iTween没有提供在Update()中实现动画播放的方法,iTween仅仅支持部分方法在Update()方法中使用,详细的大家能够自己去了解iTween的API文档。

2、我们主要通过isMoving标志来标记当前的状态,使用OnTriggerEnter()方法来推断角色是否走上了芦苇垫子。当角色走上芦苇垫子上时,就開始播放寻路动画。

当到达起点/终点时,寻路动画即停止。

当角色再次走上芦苇垫子时,再次開始寻路动画。

3、我们再Update()方法中通过改变角色的位置实现了角色和芦苇垫子的同步移动,当到达起点/终点时,寻路动画即停止,直到下一次被触发。

4、触发与碰撞的差别在于触发不会产生力的作用。能够通过OnTriggerEnter/OnTriggerStay/OnTriggerExit方法分别监听触发開始、触发中、触发结束。

要使用Trigger须要勾选碰撞器的isTrigger选项。详细的差别我会在后面的文章中为大家做解说。

这篇文章中用到的东西就是这么多,基本的难点是寻路动画的控制。因为官方没有提供有关的方法。所以我们仅仅能採用Pause()、Resume()方法来控制角色的动画。最后我们来一起看看实现的效果吧。是不是有仙灵到的感觉呢?呵呵

最后奉上几个民间的同人游戏演示:

1、UDK制作的仙剑一3D版仙灵岛场景

2、U3D制作的仙剑五前传同人演示1

U3D制作的仙剑五前传同人演示2

每次看到这里。内心都会充满一种希望,希望在有生之年玩到很多其它的仙剑,踏歌长行、梦想永续!

继续努力吧!

喜欢我的博客请记住我的名字:秦元培。我的博客地址是:blog.csdn.net/qinyuanpei

转载请注明出处。本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24038749

版权声明:本文博客原创文章,博客,未经同意,不得转载。

转载请注明出处和作者。谢谢!

转载于:https://www.cnblogs.com/gcczhongduan/p/4614399.html

[Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛相关推荐

  1. 从零开始丨使用Unity3D进行VIVE VR游戏开发

    从零开始丨使用Unity3D进行VIVE VR游戏开发 SteamVR插件的导入 使用Unity3D进行VR游戏的开发,首先需要具备以下条件 1 拥有一台显卡不低于GTX960性能的主机 2 拥有一部 ...

  2. 基于Unity3D的AR小游戏开发【100011412】

    本科毕业设计(论文) GRADUATION DESIGN(THESIS) 基于 Unity3D 的增强现实游戏程序 摘要 增强现实(AR)作为一项新兴技术近年来被越来越多的人群所获知,AR 也渐渐走进 ...

  3. Unity3D——学习分享(一) 游戏开发

    自学游戏开发也有一段时间了,很早就想把自己所学到的知识做个笔记总结一下,但因为种种的原因一直没能坚持下来,所以现在我打算现在开始把我学到的内容总结下来,主要的目的是: 把自己的所学所感记录下来,方便自 ...

  4. Unity-3D捕鱼达人小游戏开发 —— 起因和开始的设置以及准备工作

    起因 假期里的软件实践课,使用Unity-3D写一个游戏,试想也不能太low,但是奈何素材和资源太难找,在论坛上逛到了捕鱼达人的素材,便来试一试 开始 素材毕竟是从网上扒的,我觉得也不好放出来,存在网 ...

  5. Delphi程序员的“Unity3D”:开源跨平台游戏开发引擎Castle Game Engine(CGE)

    官方网站:https://castle-engine.io/features.php Delphi牛人开发的3D/2D开源游戏引擎支持: 跨平台(Linux,Windows,Mac OS X,Free ...

  6. 【Unity3D入门教程】游戏开发利器UGUI的基本使用方法

    前言 UGUI是Unity官方推出的新一代交互系统,与传统的GUI相比,它具有使用灵活.界面美观.支持个性化定制的特点.本文将会进行UGUI使用的简单介绍,与大家一起敲开UGUI开发的大门. 说到底, ...

  7. 基于unity3D的趣味桌球游戏开发

    设计主题 游戏中的主场景是一个四面有墙的场景,桌面上放置有可以滚动的小球和多个小方块,游戏开始后,玩家通过键盘控制球去吃方块,游戏得分会随着方块的减少而增长,当小球吃完全部的方块,得分达到最高,此时游 ...

  8. Unity3D官方二维游戏开发教程中文版分享

    什么二维游戏这么重要? 的三维游戏已不是什么秘密. 很容易的创建经常的游戏.Unity无疑是一个伟大的三维游戏引擎. 游戏想法,可能会受到二维的限制.但事实上有许多游戏可以很好的利 识.我们还 会包含 ...

  9. Unity-3D 第一个小游戏开发

    准备 四张图 以上 将图片拖入工具中 为除背景之外的每一张图三都建立一个视图层 选择僵尸的图片,如图操作,准备将图片切割 在此可以选择需要适配的分辨率,也可以自己定义 观察背景图的像素和尺寸 由于背景 ...

  10. Unity-3D捕鱼达人小游戏开发 —— 生成鱼

    在这16个位置生成鱼,也就是创建16个空项目来装出生点,设置锚点和坐标,尺寸合适 并且将所有出生点的红轴旋转指向地图 创建一个空项目然后挂脚本 MakeFish.cs public class Mak ...

最新文章

  1. bzoj 2006 [NOI2010]超级钢琴 rmq+堆
  2. response html 页面,使用response将html拼接页面写到当前浏览器端完成自动提交功能...
  3. 只在堆上或只在栈上定义对象
  4. ubuntu下sublime如何一次只打開一個文件
  5. java垃圾回收机制标记_Java的垃圾回收机制-垃圾收集算法(一)
  6. Python——装饰器的学习笔记
  7. docker运行storm及wordcount实例
  8. Linux安装Oracle,卡在60%处的解决方法
  9. Verilog语法入门
  10. 资源分享 | 敬伟 PS 教程 ABCD 四套全集
  11. 机器学习入门——线性回归预测广告投入数据集
  12. POI Cannot add merged region XXX to sheet because it overlaps with an existing merged region问题解决
  13. C语言 数组插入 – 插入排序
  14. 115网盘批量转存工具
  15. Java程序员该怎么更好的提升自己
  16. 应用系统设计:预约挂号平台,B2C平台设计
  17. php正则判断数字和英文,PHP正则匹配中英文、数字及下划线的方法【用户名验证】...
  18. 男神网络红人莫小涛2022生活百度图片大全
  19. 山东理工大学计算机期末考试题,山东理工大学计算机基础试题11
  20. 二十一、JVM可视化监控工具

热门文章

  1. 以太坊 solidity 教程
  2. C++ std::set insert 怎么得到 返回值 是什么
  3. java violate 实例_Java的Volatile实例用法及讲解
  4. al32utf8的日期格式_五分钟学会Oracle数据库字符集
  5. LightMapping和LightProbe
  6. rtl8188eu无线网卡驱动linux,关于rtl8188eu_Linux的驱动问题想请教一下
  7. java截取utf8字符串_java中常用的字符串的截取方法
  8. 阶段3 1.Mybatis_10.JNDI扩展知识_2 补充-JNDI搭建maven的war工程
  9. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_7_Stream流中的常用方法_limit...
  10. iOS 自定义底部tabbar加号按钮实现方法