大家好,我是秦培。欢迎关注我的博客。我的博客地址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,从终点到起点为1
private 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

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

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

[Unity3D]Unity3D圣骑士模仿游戏开发传仙灵达到当局岛的更多相关文章

  1. [Unity3D]Unity3D持久性数据的游戏开发PlayerPrefs采用

    大家好,我是秦培,欢迎关注我的博客,我的博客地址">blog.csdn.net/qinyuanpei. 博主今天研究了在Unity3D中的数据持久化问题.数据持久化在不论什么一个开发领 ...

  2. Unity3D游戏开发初探—3.初步了解U3D物理引擎

    一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:“如果说我看得比较远的话,那是因为我站在巨人的肩膀 ...

  3. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

  4. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  5. [Unity3D]Unity3D圣骑士当游戏开发商遭遇Mecanim动画系统

            大家好.我是秦培.欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 博主总算赶在这个月底写出了这篇文章.这个月由于期末考试一直没时间研究太多关于技术方面 ...

  6. Unity3D手机游戏开发

    <Unity3D手机游戏开发> 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 ...

  7. [Unity3D]Unity3D游戏开发之伤害数值显示

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.众所周知,在RPG游戏策划中最为重要的一个环节是数值策划.数值策划是一个关于游戏平衡方面的概念 ...

  8. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)

    ---------------------------------------------------------------------------------------------------- ...

  9. OpenNI结合Unity3D Kinect进行体感游戏开发(转)

    OpenNI结合Unity3D Kinect进行体感游戏开发(转) 楼主# 更多 发布于:2012-07-17 16:42     1. 下载安装Unity3D(目前版本为3.4)2. 下载OpenN ...

随机推荐

  1. java生成UUID通用唯一识别码 (Universally Unique Identifier) 分类: B1_JAVA 2014-08-22 16:09 331人阅读 评论(0) 收藏

    转自:http://blog.csdn.net/carefree31441/article/details/3998553 UUID含义是通用唯一识别码 (Universally Unique Ide ...

  2. 转载:使用bat命令来快速安装和卸载Service服务

    一般我们在编写完Service服务程序后,都是通过cmd命令提示窗口来安装或卸载服务,但频繁的在cmd窗口中去“拼”文件的路径着实让人“不能忍”.所以,我们需要一钟“更快捷”的方式来进行安装或者卸载操 ...

  3. php实现数组中的逆序对(归并排序实现:排序 辅助数组)

    php实现数组中的逆序对(归并排序实现:排序 辅助数组) 一.总结 这题用归并排序  线段树   树状数组 等操作的复杂度应该都是小于n方的 二.php实现数组中的逆序对 题目描述 在数组中的两个数字 ...

  4. 基于 Android NDK 的学习之旅-----Android.mk 介绍

    一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...

  5. Java中的equals比较,小坑一个

    最近工作中,经常需要比较2个对象的值.有个问题经常遇到,就是下面的2种情况. public static void main(String[] args) { Integer a =11; Objec ...

  6. 5.7-GTID复制搭建

    基本环境   Master Slave MySQL版本 MySQL-5.7.16-X86_64 MySQL-5.7.16-X86_64 IP 192.168.56.156 192.168.56.157 ...

  7. 接入Erlang控制台的几种方法

    在window中调试的时候我们可以通过启动多个cmd窗口运行Erlang节点,在生产环境中我们需要Erlang服务在Centos服务器上后台运行;这就需要在启动的时候添加启动参数detached来脱离 ...

  8. 【codeforces 765A】Neverending competitions

    [题目链接]:http://codeforces.com/contest/765/problem/A [题意] 给你一个人的n个行程 行程都是从家到某个地方或从某个地方到家; 且是无序的,且如果到了非 ...

  9. CSS拾遗(一)

    重新看<精通CSS(第二版)>做一些记录,方便今后巩固. 1.外边距叠加 只有普通文档流中块框的垂直外边距才会发生外边距叠加.行内框.浮动框.或绝对定位框之间的外边距不会叠加. 2.相对定 ...

  10. 如何向数据库添加时同时返回ID

    我们在做项目开发时很多时候都需要数据库的增删改查,而添加数据后又想得到该项数据在数据库中的主键值,这里有一个非常方便的方法可以在插入数据的同时获得主键值. public void save(Perso ...