2016-12-12 15:06:00 qq_26270779 阅读数 3357
  • 从零开始开发3D跑酷游戏教程

    从零开发3D跑酷游戏视频培训课程,教大家从零开始开发一个3D跑酷游戏,涵盖了手势识别、动画系统、水平控制、纵向控制、金币获取、急速暴走、强力磁铁、超级跑鞋、双倍积分、跨越栅栏、车辆管理、随即场景等功能点。手把手教您制作一款游戏特效。

    3827 人正在学习 去看看 洪青霞

在知识库看到这样一篇博客,虽然效果比较糙,但是能学到不少东西。

比如,相机跟随的效果如何实现,酷跑道路无限循环。

很有意思,推荐给大家,活到老学到老啊~奋斗

游戏开发环境: win7+unity4.5+vs2013








还等啥子呦,愉悦的打开unity,新建一个project,纯净状态导入NGUI 3.6.0/自带的Scripts,一切正常你的画面将和我一样。



新建一个plane和Directional Light



plane 的大小z轴 设置为10,并且调整摄像机角度,这个平面看上去像跑道。

我为此添加一个正方体

看的更清楚。




选中plane 按ctrl+D 复制一个平面,现在有2个平面了,分别改名 bg1和 bg2,

bg1 position 的Z 为50

bg2  position 的Z 为150

这样他们就连成一条大道。




接下来实现主角向前移动

把立方体改名为player,  Project栏目里新建文件夹Scripts=>新建c#脚本 playControl



playControl代码如下,临时测试用。(后期将被Mecanim、Root Motion、Blend tree、阿凡达等好玩的东东取缔


using UnityEngine;
using System.Collections;

public class playControl : MonoBehaviour
{
    public float movespeed =10f;
    void Update()
    {
        if (Input.GetKey(KeyCode.UpArrow))
            transform.Translate(Vector3.forward * movespeed*Time.deltaTime);

        if (Input.GetKey(KeyCode.DownArrow))
            transform.Translate(Vector3.back * movespeed * Time.deltaTime);

        if (Input.GetKey(KeyCode.LeftArrow))
            transform.Translate(Vector3.left * movespeed * Time.deltaTime);

        if (Input.GetKey(KeyCode.RightArrow))
            transform.Translate(Vector3.right * movespeed * Time.deltaTime);
    }
}


playControl脚本绑定给立方体player,摄像机(Main Camera以后统称摄像机)绑定unity自带的Script脚本--SmoothFollow并且指定Target为player,

并且设置相关数值。


新建文件夹Materials和Textures(游戏相关所有素材由我激情提供

Materials文件夹 新建一个Material指定Textures里的贴图后帮bg1和bg2换个容貌,按照工业规则相关文件放在相关文件夹,以后将不再特意说明。一切就绪后你将和我一样。



这时候按键盘上下左右键,可以控制player了,如果一直按向上键player将很快将走完这条和谐之路,而我想得到一条无尽循环的路。

加油,接下来一鼓作气实现这条“不归路”。


Unity菜单- GameObject-Create Empty 

改名为trag1,

坐标设置为 0  3.5  15 

缩放设置为  1  1  0.2

为其添加 Box Collider 

Size 设置为 10  7  1

Is Trigger 打上勾

所有一切就是为了player经过这个触发器时响应bg1 bg2 动态自我复制而实现循环。



同理bg2也要有一个触发器

坐标设置为 0  3.5  115 

这样我们得到了2个触发器。




为了符合工业流程把2个触发器分别作为bg1 bg2 的子项。



那么现在将实现这2个触发器的作用了,加油!

新建c#脚本  bgtrigger,代码如下

 

using UnityEngine;
using System.Collections;

public class bgtrigger : MonoBehaviour
{
    GameObject bg;

    void Start()
    {
        bg = new GameObject();
    }

    void OnTriggerEnter(Collider e)
    {
        if (e.CompareTag("Player"))
        {
            if (gameObject.transform.parent.CompareTag("bg2"))//父类
            {
                bg = GameObject.FindGameObjectWithTag("bg1");
                bg.transform.position = new Vector3(0, 0, bg.transform.position.z + 200);
            }
            else
            {
                bg = GameObject.FindGameObjectWithTag("bg2");
                bg.transform.position = new Vector3(0, 0, bg.transform.position.z + 200);
            }
        }
    }





}


为立方体player 添加名为“Player”的tag,并且添加刚体。



新增两个Tag,  为平面bg1和平面bg2分别添加名为bg1、bg2的Tag




最后关键的一步,把上面新添加的c#脚本bgtrigger分别给trag1和trag2



把player立方体坐标设置为 0 0.5 20

运行起来,美好的事情悄然发生。

player一直前进,结果触发器后,上一个平面将复制到前面,

无限循环的马赛克路出现了!



2019-01-01 09:30:36 up_Lighter 阅读数 1440
  • 从零开始开发3D跑酷游戏教程

    从零开发3D跑酷游戏视频培训课程,教大家从零开始开发一个3D跑酷游戏,涵盖了手势识别、动画系统、水平控制、纵向控制、金币获取、急速暴走、强力磁铁、超级跑鞋、双倍积分、跨越栅栏、车辆管理、随即场景等功能点。手把手教您制作一款游戏特效。

    3827 人正在学习 去看看 洪青霞

小白零基础搞unity2D手机跑酷游戏-01-Getting Started


这是我第一次在CSDN上写博客,是想锻炼一下自己,也是对自己的一种激励吧,毕竟立了一个很大的flag,做不出来就贻笑大方了。
2019年,全新的开始。今天是2019年1月1日,祝大家元旦快乐!
好,现在先是第一篇:01-Getting Started,首先我介绍一下这个游戏的策划。

策划

游戏是一个2D的横板跑酷(用unity主要还是因为简单,有人跟我说unity和傻瓜游戏制作器差不多,我笑了,确实,你可以把它用的跟傻瓜游戏制作器一样)
在手机上玩的,主要是有这样的一个操作吧

键位

(这些操作都是我原创的,请不要转载或者私自拿去使用)
操作键位
然后按A可以冲刺一下(就是很快的往前猛冲一下),B键可以跳,1,2,3,4是技能键,
技能会有组合技,这时候就体现出来手机的优越性,比如技能是1234,你就可以用大拇指向上一翻,一下把1234划一遍,操作起来十分爽快。
道具:你在游戏中会有获得道具,也有自带道具,但是一共只有4个槽位,用按住B键并滑动到1,2,3,4上进行开启

内容

具体故事情节以后再搞,先开发出来一个游戏系统
大概就是这样:
主角在一直往前跑,对面会有各种障碍,也会有敌人
我是一名在校大学生,现在开发主要是以大学为背景,敌人大多数是什么搞推销的(嘿嘿)
然后也会有一些任务点,比如到点会提示你进行指定的技能操作
玩到一定阶段会进阶,可以进入下一阶段玩,也可以在这个阶段继续跑

OK,现在就讲这么多,大概知道自己要搞一个什么项目了

下面就是要搞unity了

今天先做一点点的准备工作吧

准备工作

我习惯是先让图片什么的都准备好再做的,有大佬跟我说,你先拿画图什么的随便画画,我受不了

大家可以先找一下一些素材图片

首先介绍一下Sprite图。

有人管他叫精灵,有人叫雪碧图,爱怎么叫怎么叫,反正unity是英文的,是Sprite就对了
Sprite就是小妖怪,小精灵嘛,雪碧的英文也叫Sprite,可以观察一下。
跑题了。Sprite是2d游戏里面很重要的概念。
但是——天气冷我不想打字,自己百度
总之Sprite图就是一张画满了画的大图,上面有很多小图

可以上这个网址找一下吧
https://www.spriters-resource.com/

关于Sprite的问题之后再谈。天气冷我不想打字,今天这篇先到这里,如果不想自己找的话,之后我用到的资源我都会放上来的,当然不会是放在CSDN下载了(本人对各种积分下载深恶痛绝)

2016-04-08 04:15:22 sun15980 阅读数 46513
  • 从零开始开发3D跑酷游戏教程

    从零开发3D跑酷游戏视频培训课程,教大家从零开始开发一个3D跑酷游戏,涵盖了手势识别、动画系统、水平控制、纵向控制、金币获取、急速暴走、强力磁铁、超级跑鞋、双倍积分、跨越栅栏、车辆管理、随即场景等功能点。手把手教您制作一款游戏特效。

    3827 人正在学习 去看看 洪青霞

在两个月前曾写了一篇《【Unity3D实战】零基础一步一步教你制作跑酷类游戏(1)》,里面一步一步演示了制作跑酷类游戏,然而由于时间原因,只写到了让角色往前移动为止。这个坑一直没有时间去填,(虽然也没多少人看啦),今天刚好有时间完成了一个跑酷类游戏的Demo。放上来给有兴趣的朋友看看。

Demo源码及对应素材下载:链接: https://pan.baidu.com/s/1smnQFt7 密码: ptcw

游戏简要说明

游戏类型:跑酷类游戏(Demo,非完整游戏)

操作方式:左右方向键(可自己移植到手机端)

游戏要素:

1.游戏角色会自动向前跑,玩家可通过左右方向键让其左右移动

2.游戏中存在障碍物,玩家需避开这些障碍物,否则会因为被障碍物阻挡的原因无法前进

3.当游戏角色因为被阻挡而消失在视野中时,视为失败

4.当游戏角色因为被阻挡而处于偏后方时,会提高移动速度直到回到原本所处的屏幕位置

游戏场景搭建

使用准备好的素材(路面、人物、障碍物),将这些素材制作成Prefab,然后根据自己喜好搭建好场景(如何搭建请看上一篇教程:《【Unity3D实战】零基础一步一步教你制作跑酷类游戏(1)》)。如下图:

游戏脚本编写

游戏角色控制器moveController:
新建一个C#文件,命名为moveController,然后将其打开。
由于角色需要向前、左、右三个方向移动,所以我们需要有其在前进方向上的速度左右方向上的速度,分别命名为:moveVSpeed、moveHSpeed,
同时由于玩家在落后的情况下需要加速,所以我们声明两个变量:前进方向上的最小移动速度minVSpeed前进方向上的最大移动速度maxVSpeed
于是我们可以得到以下脚本:
// 前进移动速度
float moveVSpeed;
// 水平移动速度
public float moveHSpeed = 5.0f;
// 最大速度
public float maxVSpeed = 10.0f;
// 最小速度
public float minVSpeed = 5.0f;
其中moveHSpeed、maxVSpeed、minVSpeed声明为public,方便在面板上修改。

错误修改:感谢 jewis123 朋友提出的,这里漏了jumpHeight与m_jumpState的定义,前者代表最大高度,后者代表当前是向上跳跃,还是从高处落下,详细可查看源码。

接下来,在Start()函数中定义moveVSpeed的初始值:
        moveVSpeed = minVSpeed;
在Update()中使人物能移动起来:
        float h = Input.GetAxis("Horizontal");
        Vector3 vSpeed = new Vector3(this.transform.forward.x, this.transform.forward.y, this.transform.forward.z) * moveVSpeed ;
        Vector3 hSpeed = new Vector3(this.transform.right.x, this.transform.right.y, this.transform.right.z) * moveHSpeed * h;
        Vector3 jumpSpeed = new Vector3(this.transform.up.x, this.transform.up.y, this.transform.up.z) * jumpHeight * m_jumpState;
        this.transform.position += (vSpeed + hSpeed + jumpSpeed) * Time.deltaTime;
保存一下cs文件,切换到Unity,将该脚本挂载在角色对象的身上,保留默认值或手动设置:


运行游戏,看看是否能成功跑起来,并且能通过左右键控制人物左右移动。

看着人物越跑越远越跑越远,最后消失在远方......诶!教练,这和说好的不一样啊!人物咋不见了?

咳咳,这是因为我们没有让摄像机跟随它的原因,接下来,我们让摄像机与人物一起移动~

打开刚才的C#文件,声明一个public的变量

    // 摄像机位置
    public Transform cameraTransform;

在Update()函数中,添加以下代码:

// 设置摄像机移动速度
Vector3 vCameraSpeed = new Vector3(this.transform.forward.x, this.transform.forward.y, this.transform.forward.z) * minVSpeed;
// 让摄像机跑起来
cameraTransform.position += (vCameraSpeed) * Time.deltaTime;

注意到没,这里我们所定义的摄像机的移动速度与人物移动速度有点差别:
1.摄像机没有左右移动
2.摄像机的速度恒定为minVSpeed,也就是我们所定义的人物的最小移动速度(当然这个时候人物也一直是以这个速度在移动)

转到Unity,查看人物身上的Move Controller组件,现在这里应该多了一个变量等你设置:

我们将摄像机拖动到camera Transform处,再运行游戏。这时候你应该能看到人物在不断往前走,但在屏幕上的位置是没有变化的,因为摄像机一起移动了。

人物走着走着 哎呀 前面怎么没路了?别急,让我们来让路无限延长起来~

首先我们将道路的GameObject复制几个,我这里是总共有3个道路的GameObject,分别命名为Road1,Road2,Road3

然后在每一个Road下,添加一个Cube,将Cube的Mesh Renderer关闭,并将其Box Collider的Is Trigger勾上。命名为ArrivePos。(我才不会告诉你们这一步应该在上一行之前做呢!)

多条道路拼好,连成一条笔直的公路。

然后新建一个空物体,命名为GameManager,为其新建C#Script  GameManager.cs,然后打开该脚本。

声明一下多个变量:(注意引用命名空间using System.Collections.Generic;
    // 生成障碍物点列表
    public List<Transform> bornPosList = new List<Transform>();
    // 道路列表
    public List<Transform> roadList = new List<Transform>();
    // 抵达点列表
    public List<Transform> arrivePosList = new List<Transform>();
    // 障碍物列表
    public List<GameObject> objPrefabList = new List<GameObject>();
    // 目前的障碍物
    Dictionary<string, List<GameObject>> objDict = new Dictionary<string, List<GameObject>>();
    // 道路间隔距离
    public int roadDistance;
并定义函数:
    // 切出新的道路
    public void changeRoad(Transform arrivePos)
    {
        int index = arrivePosList.IndexOf(arrivePos);
        if(index >= 0)
        {
            int lastIndex = index - 1;
            if (lastIndex < 0)
                lastIndex = roadList.Count - 1;
            // 移动道路
            roadList[index].position = roadList[lastIndex].position + new Vector3(roadDistance, 0, 0);

            initRoad(index);
        }
        else
        {
            Debug.LogError("arrivePos index is error");
            return;
        }
    }

    void initRoad(int index)
    {
        
        string roadName = roadList[index].name;
        // 清空已有障碍物
        foreach(GameObject obj in objDict[roadName])
        {
            Destroy(obj);
        }
        objDict[roadName].Clear();

        // 添加障碍物
        foreach(Transform pos in bornPosList[index])
        {
            GameObject prefab = objPrefabList[Random.Range(0, objPrefabList.Count)];
            Vector3 eulerAngle = new Vector3(0, Random.Range(0, 360), 0);
            GameObject obj = Instantiate(prefab, pos.position, Quaternion.EulerAngles(eulerAngle)) as GameObject;
            obj.tag = "Obstacle";
            objDict[roadName].Add(obj);
        }
    }

在Start()中:
    void Start () {
        foreach(Transform road in roadList)
        {
            List<GameObject> objList = new List<GameObject>();
            objDict.Add(road.name, objList);
        }
        initRoad(0);
        initRoad(1);
    }
然后打开之前的moveController.cs,声明变量:
    // 游戏管理器
    public GameManager gameManager;
定义函数:
    void OnTriggerEnter(Collider other)
    {
        // 如果是抵达点
        if (other.name.Equals("ArrivePos"))
        {
            gameManager.changeRoad(other.transform);
        }
        // 如果是透明墙
        else if (other.tag.Equals("AlphaWall"))
        {
            // 没啥事情
        }
        // 如果是障碍物
        else if(other.tag.Equals("Obstacle"))
        {

        }
    }
  呼,一大串代码,大家敲的累不累,什么!你是copy过去的?太过分了!我要拿刀子了!

嗯,切换回Unity中,点击GameManager这个物体,设置其GameManager组件的值:


这里的BornPos指的是障碍物出生点,以下图所示为每一条道路定义一个或多个出生点,每条路的出生点用一个BornPos的空物体进行管理:
然后将出生点按其所处道路的序号一一拖入(先设置size的值,3条就设置为3)
RoadList也是一样,将道路按序号一一拖入。

这里的ArrivePosList要注意一下,并不是直接按道路序号拖入,而是往后一位,即:
road2
road3
........
roadn
road1
这样的顺序将其对应的ArrivePos拖入列表

然后将需要生成的障碍物的Prefab文件拖入ObjPrefabList
设置道路的间隔距离(即一条道路的中心点到接下来一条道路中心点的距离 distance = road1.length / 2 + road2.length / 2 大概这么计算)

到这一步为止,GameManager的设置基本完成。点击人物的GameObject,设置moveController,将GameManager的游戏对象拖入到指定位置:


对了,还有一步非常重要的设置:
为人物添加Collider与RightBody,为所有障碍物和路面添加Collider(注意不要勾上Is Trigger)

然后运行游戏。

呼,这时候没有问题的话应该是能看到有障碍物出现了,人物走到障碍物处会被挡住,并且道路会自动拼接移动,无止境的走下去、走下去、走下去。。。

这个Demo也基本进入尾声了,接下来,做最后的游戏失败判断和让角色赶回正常位置。

打开GameManager.cs,声明变量:

    public bool isEnd = false;

打开moveController.cs 声明变量:

    // 摄像机距离人物的距离
    public float cameraDistance;

在Update()函数中 添加以下代码:
// 当人物与摄像机距离小于cameraDistance时 让其加速
        if(this.transform.position.x - cameraTransform.position.x < cameraDistance)
        {
            moveVSpeed += 0.1f;
            if (moveVSpeed > maxVSpeed)
            {
                moveVSpeed = maxVSpeed;
            }
        }
        // 超过时 让摄像机赶上
        else if(this.transform.position.x - cameraTransform.position.x > cameraDistance)
        {
            moveVSpeed = minVSpeed;
            cameraTransform.position = new Vector3(this.transform.position.x - cameraDistance, cameraTransform.position.y, cameraTransform.position.z);
        }
        // 摄像机超过人物
        if(cameraTransform.position.x - this.transform.position.x > 0.0001f)
        {
            Debug.Log("你输啦!!!!!!!!!!");
            gameManager.isEnd = true;
        }

定义OnGUI()函数:
void OnGUI()
    {
        if (gameManager.isEnd)
        {
            GUIStyle style = new GUIStyle();

            style.alignment = TextAnchor.MiddleCenter;
            style.fontSize = 40;
            style.normal.textColor = Color.red;
            GUI.Label(new Rect(Screen.width / 2 - 100, Screen.height / 2 - 50, 200, 100), "你输了~", style);

        }
    }

到这一步,Demo编写完成。(由于现在是凌晨4点 实在太疲惫,所以本篇基本都是直接贴代码,如果有朋友有什么问题的话 可以直接留言哈~)

2015-03-03 16:36:25 book_longssl 阅读数 1694
  • 从零开始开发3D跑酷游戏教程

    从零开发3D跑酷游戏视频培训课程,教大家从零开始开发一个3D跑酷游戏,涵盖了手势识别、动画系统、水平控制、纵向控制、金币获取、急速暴走、强力磁铁、超级跑鞋、双倍积分、跨越栅栏、车辆管理、随即场景等功能点。手把手教您制作一款游戏特效。

    3827 人正在学习 去看看 洪青霞

  现在特别火的跑酷游戏《神庙逃亡》是用Unity3D引擎开发的,游戏中人物的操控,手指拨动(划动)人物就转向,利用手机的重力感应进行人物左右调整。
  今天也尝试写了下用Unity来实现这样的功能,在官方的API有Input.touches(触摸列表),TouthPase(触摸状态),Input.acceleration加速度传感器
  关于Input.acceleration在手机中的坐标是这样的,图下次再贴上
  只截一个关键部分的截图吧,具体的细节还没有配合模型使用,使用好了再帖出代码
  

  




   

2015-03-08 22:39:57 book_longssl 阅读数 1083
  • 从零开始开发3D跑酷游戏教程

    从零开发3D跑酷游戏视频培训课程,教大家从零开始开发一个3D跑酷游戏,涵盖了手势识别、动画系统、水平控制、纵向控制、金币获取、急速暴走、强力磁铁、超级跑鞋、双倍积分、跨越栅栏、车辆管理、随即场景等功能点。手把手教您制作一款游戏特效。

    3827 人正在学习 去看看 洪青霞



在我们的Unity手机游戏项目中,GUI的表现采用NGUI。记录一下我们的处理方式:

问题:1、需要处理大量按钮的点击事件

        2、需要处理界面跳转事件

        3、需要处理界面元素更新事件

解决方案:

      GUIClickEventReceiver.cs

      GUIManager.cs

思路:

      GUIClickEventReceiver 解决按钮点击事件

      GUIManager 管理GUI的跳转与更新


实现:

图一:Editor Inspector面板方便选取对应事件

图二:清晰的代码组织结

主要逻辑:

public void OnClick ()
    {
        bool playSoundEffect = true;
        switch (clickType) {
        case ClickType.StartGame:
            GameManager.instance.startGame ();
            break;
        case ClickType.Store:
            GUIManager.instance.showGUI (GUIState.Store);
            break;
        case ClickType.Stats:
            GUIManager.instance.showGUI (GUIState.Stats);
            break;
        case ClickType.DoubleCoinUpgrade:
            GameManager.instance.upgradePowerUp (PowerUpTypes.DoubleCoin);
            break;
        case ClickType.CoinMagnetUpgrade:
            GameManager.instance.upgradePowerUp (PowerUpTypes.CoinMagnet);
            break;
        case ClickType.InvincibilityUpgrade:
            GameManager.instance.upgradePowerUp (PowerUpTypes.Invincibility);
            break;
        case ClickType.AddSpeedUpgrade:
            GameManager.instance.upgradePowerUp (PowerUpTypes.AddSpeed);
            break;
        case ClickType.ProtectionCoverUpgrade:
            GameManager.instance.upgradePowerUp(PowerUpTypes.ProtectionCover);
            break;
        case ClickType.AttackGunUpgrade:
            GameManager.instance.upgradePowerUp(PowerUpTypes.AttackGun);
            break;
        case ClickType.EndGame:
            GUIManager.instance.showGUI (GUIState.EndGame);
            break;
        case ClickType.Restart:
            GameManager.instance.restartGame (true);
            break;
        case ClickType.MainMenu:
            GameManager.instance.backToMainMenu (false);
            break;
        case ClickType.MainMenuRestart:
            GameManager.instance.backToMainMenu (true);
            break;
        case ClickType.Pause:
            GameManager.instance.pauseGame (true);
            playSoundEffect = false;
            break;
        case ClickType.Resume:
            GameManager.instance.pauseGame (false);
            break;
        case ClickType.ToggleTutorial:
            GameManager.instance.toggleTutorial ();
            break;
        case ClickType.Missions:
            GUIManager.instance.showGUI (GUIState.Missions);
            break;
        }

        if (playSoundEffect)
            AudioManager.instance.playSoundEffect (SoundEffects.GUITapSoundEffect);
    }






[3D跑酷] AudioManager

阅读数 991

没有更多推荐了,返回首页