2012-06-26 23:07:01 ariel7321 阅读数 13395

接下来的几周内,我准备把对如何用Unity3D制作愤怒的小鸟的研究过程记录下来,希望能完成愤怒的小鸟游戏的大部分功能。


好记性不如烂笔头,开始吧!


目标:制作开头loading时的Logo界面,4秒后进入下一个界面。


1.  建一个空Project,将屏幕分辨率改为800*600.

File--->Build Settings...---->PC and Mac Standalone--->Player Settings...--->Resolution and Presentation


2. 创建一个GUI Texture,重命名为Logo,然后Logo图片放到这个GUI Texture上,修改其参数如下:



3. 创建一个Scene,命名为PlayScene。然后把Scene都加入到build中



4. 我们来写个脚本实现界面切换功能。

#pragma strict

var timeInterval : int = 4;
var level : int;

private var timeUpdate : float;

function Start () {

}

function Update () {
	timeUpdate += Time.deltaTime;
	if (timeUpdate > timeInterval) {
		Application.LoadLevel(level);
	}

}

5. 将这个脚本赋给LogoScene中的camera,将Level值改为1.


OK,运行试试吧!


2018-11-24 15:36:08 soukenan 阅读数 1916

非常高兴我能学到热门游戏愤怒的小鸟,在Siki学院学Untiy 3D制作游戏的课程还是进步很快的。让我们一起学起来!

小鸟的拖拽(最大距离的限制)

我们使用**Spring Joint弹簧关节:弹簧关节组连接两个刚体,让它们像被弹簧连接着一样运动。**来实现;
在这里插入图片描述

在这里插入图片描述

把右边的树枝赋值给小鸟的Connected Body 连接体;
Distances需要缩短距离;

在这里插入图片描述
Frequency发生频率设置为2;

1.为所选的游戏对象添加弹簧关节组件,依次打开菜单栏component->Physics->Spring Joint

2.Spring Joint 组件的属性面板

connected boby:连接刚体,用于为弹簧指定要连接的刚体,若不指定该弹簧将与世界相连接

anchor:锚点,设置joint在对象局部坐标系中的位置,着并不是对象将弹向的点

Spring:弹簧,设置弹簧的强度,数值越高弹簧的强度就越大

Damper:阻尼,设置阻尼的系数,阻尼系数越大,弹簧强度越小的幅度越大

Min Distance:最小距离,设置弹簧启用的最小距离值,如果两个对象的之间的当前距离与初始距离的差大于该值,则不会开启弹簧

max Distance:最大距离,设置弹簧启用的最大距离值,如果两个对象之间的当前距离与初始距离的差小于该值,则不会开启弹簧

break Distance:断开力,设置弹簧关节断开所需要的作用力

2019-01-27 15:52:04 qq_37421018 阅读数 564

 

弹弓的弹力实现:

LineRenderer:

该组件主要用来描绘弹弓两边的弹簧线,弹弓是由两张图片组成,在这两个弹弓上添加LineRenderer组件之后,就可以在脚本里面控制其来划线,这里就是简单的在拖动鸟的时候画上两条直线就是了。参数没什么要改的,可以看官方文档看一下就行。

弹簧结构:其中SlingShot就是上面的两张图片(分左右),其下面的子物体就是用来确定画线时另一个点的位置,同时后面也有用。

画线代码:什么时候画就是各位根据需求画了,我这里是在开始拖动鸟的时候,当你不想它画出线的时候开业直接禁用该组件,就是下面代码的一二行改为false即可。

SpringJoint 2D:

该组件简单点儿说就有点像初中物理课上讲的弹簧记力器,最上面一段是不可以拉,下面有一段可以拉,并且有弹力,如图:

上面一段就是绳子部分,不具备弹力,下面就是具有弹力的部分,要使用该组件必须要简单说一两个刚体,自己有一个,另外一个作为参数(就是固定绳子的位置),说一下其参数

Connected Rigid Body:就是说的固定绳子的位置

Auto Configuer Connected Anchor:这个勾上它就会在自己速度为0的时候自动禁用

Distance:弹簧顶端距离绳子位置的距离,修改参数的效果

Frequency:弹簧的弹性系数,越大,弹簧越有弹性

Break Force:弹簧最大的承受力

差不多参数就介绍这些,主要使用就是在小鸟开始的时候启用该脚本,之后拖动产生弹力,松开一段时间后禁用该组件,随后小鸟就会顺着弹力飞出去,这里还涉及RigidBody的设置。

飞出代码:

trailRenderer是后面的内容,这里就只有第一句话与该项相关。

RigidBody 2D:

这里主要涉及Body Type类型,有三种:Dynamic(动态的),Static,Kinematic(物理学的),这里在小鸟被拖动的时候需要将rigidBody设置为Kinematic的,就是在拉动的时候不会受到弹力以及重力的影响,否则松开后会产生很大的力(不是很清楚原理,估计是在拉的时候就有弹力以及重力的综合影响),所以在拉动的时候要改为Kinematic不受物理影响,之后再在松开手的时候改回Dynamic,那么这个时候的力就是当前位置的弹力加上重力。

拖尾效果:

所谓拖尾效果就是小鸟飞行时候的轨迹,以及武器挥舞时武器产生的残影。

TrailRenderer:

unity自带的拖尾组件,将该组件挂在物体上,该物体在移动的时候自身就会产生拖尾效果,这里我是挂在小鸟下的一个空物体上的

其参数不去详细介绍,需要一个材质,自己如果只是做简单的效果需要的材质的shader为下图的类型,这个就是个简单的颜色。制作拖尾当然还可以使用插件,但是好用的都要钱,我也没有一个好的推荐,暂时就用这个就行,不需要太复杂。

2018-02-10 01:33:15 ChinarCSDN 阅读数 3209

Unity愤怒的小鸟游戏教程(二)


本文提供全流程,中文翻译。

Chinar坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



AngryEva游戏效果:

这里写图片描述



教程一,请点击↓↓

Unity3D游戏-愤怒的小鸟游戏源码和教程(一)


1

LevelFrameSelect —— 关卡框选择



用来控制关卡框的解锁,页面跳转

举个栗子黑白88

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;


/// <summary>
/// 关卡框架选择 —— 用来控制关卡的解锁与否
/// </summary>
public class FrameSelect : MonoBehaviour
{
    public  int        StarNum;           //行星数量
    public  bool       isSelect;          //是否可选
    public  GameObject LocksGameObject;   //枷锁
    public  GameObject StarsGameObject;   //星星
    public  GameObject AllFramePanel;     //所有选关界面
    public  GameObject MapLevelPanel;     //关卡界面
    private Button     SelectButton;      //按钮组件
    public  Text       LevelStarsText;    //关卡星星数量
    public  int        LevelStarNum  = 0; //关卡开始数量
    public  int        LevelEndCount = 2; //关卡结束数量


    void Start()
    {
        //PlayerPrefs.DeleteAll();

        SelectButton = GetComponent<Button>();
        SelectButton.onClick.AddListener(ToMapLevel); //绑定选关按钮事件

        SelectButton = GameObject.Find("ExitGameButton").GetComponent<Button>();
        SelectButton.onClick.AddListener(ExitGame); //绑定退出游戏按钮事件

        SelectButton = GameObject.Find("BackStartPanelButton").GetComponent<Button>();
        SelectButton.onClick.AddListener(BackStarPanel); //绑定按钮事件

        if (PlayerPrefs.GetInt("AllStarNum", 0) >= StarNum) //声明一个所有星星数量>0
        {
            isSelect = true; //可以选择
        }
        if (isSelect)
        {
            LocksGameObject.SetActive(false); //关闭枷锁
            StarsGameObject.SetActive(true);  //开启星星计数
            //显示星星
            int counts = 0; //用来计数关卡的总星星个数
            for (int i = LevelStarNum; i <= LevelEndCount; i++)
            {
                counts += PlayerPrefs.GetInt("Level (" + i + ")", 0);
            }
            LevelStarsText.text = counts + "/9";
        }
    }


    /// <summary>
    /// 跳转到关卡界面
    /// </summary>
    public void ToMapLevel()
    {
        if (isSelect)
        {
            AllFramePanel.SetActive(false); //关闭选关界面
            MapLevelPanel.SetActive(true);  //开启关卡界面
        }
    }


    /// <summary>
    /// 退出游戏
    /// </summary>
    public void ExitGame()
    {
        Application.Quit();
    }


    /// <summary>
    /// 返回开始界面
    /// </summary>
    public void BackStarPanel()
    {
        SceneManager.LoadScene(0);
    }
}

这里写图片描述

这里写图片描述


2

MapLevel —— 关卡页面脚本



用来控制每个关卡的解锁,和跳转到游戏场景

举个栗子黑白88Chinar的GitHub工程案例

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;


/// <summary>
/// 关卡选择脚本
/// </summary>
public class MapLevel : MonoBehaviour
{
    public  bool         isSelect;      //可选状态
    public  Sprite       LevelSprite;   //替换关卡图
    private Image        LeveLImage;    //UI关卡图组件
    public  GameObject   AllFramePanel; //选关场景界面
    private Button       BackButton;    //返回按钮
    public  GameObject[] Stars;         //星星数组
    public  string       BiaoShiString; //标示
    public  bool         isDevelop;     //是否开发


    private void Awake()
    {
        LeveLImage = GetComponent<Image>();
    }


    void Start()
    {
        BackButton = transform.parent.parent.transform.Find("Map1_BackButton").GetComponent<Button>();
        BackButton.onClick.AddListener(ToFrame); //绑定按钮事件
        BackButton = GetComponent<Button>();
        BackButton.onClick.AddListener(Selected);                 //绑定按钮事件
        if (transform.parent.GetChild(0).name == gameObject.name) //判断是否是第一关
        {
            isSelect = true;
        }
        else //判断前一关的分数
        {
            if (BiaoShiString == "0")
            {
                int beforeNum = transform.GetSiblingIndex() - 1;
                if (PlayerPrefs.GetInt("Level ("            + beforeNum + ")") > 0)
                {
                    isSelect = true;
                }
            }
            else if (BiaoShiString != null && isDevelop)
            {
                int beforeNum = transform.GetSiblingIndex() - 1;
                if (beforeNum < 2) //限定前三个
                {
                    if (PlayerPrefs.GetInt("Level (" + BiaoShiString + beforeNum + ")") > 0) //判断并解开后一关关卡
                    {
                        isSelect = true;
                    }
                }
            }
        }


        if (isSelect) //处理关卡显示效果
        {
            LeveLImage.overrideSprite = LevelSprite;               //替换图片
            transform.Find("LevelNum").gameObject.SetActive(true); //开启关卡名
            int num = PlayerPrefs.GetInt(gameObject.name);         //关卡名:对应行星数量
            if (num > 0)                                           //显示几颗星
            {
                for (int i = 0; i < num; i++)
                {
                    Stars[i].SetActive(true);
                }
            }
        }
    }


    /// <summary>
    /// 跳转到选关场景界面
    /// </summary>
    public void ToFrame()
    {
        AllFramePanel.SetActive(true);                       //关闭选关界面
        transform.parent.parent.gameObject.SetActive(false); //开启关卡界面
    }


    /// <summary>
    /// 进入关卡
    /// </summary>
    public void Selected()
    {
        if (isSelect)
        {
            PlayerPrefs.SetString("NowLevel", gameObject.name);
            SceneManager.LoadScene(2);
        }
        else
        {
            if (isDevelop == false) //未曾开发
            {
                GameObject obj = Instantiate(Resources.Load<GameObject>("Prefabs/HintPanel")); //提示页面
                obj.transform.SetParent(GameObject.Find("Canvas").transform);
                obj.transform.localPosition = Vector3.zero;
                Destroy(obj, 2);
            }
        }
    }
}

这里写图片描述

这里写图片描述





Chinar


支持

May Be —— 搞开发,总有一天要做的事!


拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!


先点击领取 —— 阿里全产品优惠卷 (享受最低优惠)


1 —— 云服务器超全购买流程 (新手必备!)

2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

3—— Windows 服务器配置、运行、建站一条龙 !

4 —— Linux 服务器配置、运行、建站一条龙 !





技术交流群:806091680 ! Chinar 欢迎你的加入


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

2018-11-29 15:49:01 soukenan 阅读数 392

出品 | Siki 学院
Unity 通过Line Renderer绘制两点之间的直线;

弹弓左右枝上分别建立一个画线点,并在左右枝上分别添加【Line Renderer】组件,该组件,给材质添加材质球,在颜色属性处改变颜色,在【whdth】属性处改变宽度。
画线的操作在小鸟的代码中,声明两个公共位置变量(在编辑器赋左右枝的画线点),声明两个公共画线组件(同样在编辑器将左右两枝赋给他),写画线函数。放在isClick判断句内。

细节请观看Siki学院的视频。
在这里插入图片描述

public class Bird:MonoBehaviour{
    private bool isClick=false;//判断是否点击鼠标
    
    public float maxDis=3;
    private SpringJoint2D sp;
    private Rigidbody2D rg;
    
    public LineRenderer right;
    public Transform rightPos;
    public Transform leftPos;
    public LineRenderer left;
    
    private void Awake(){
    sp=GetComponent<SpringJoint2D>();
    rg=GetComponent<Rigidbody2D>();
    }

    private void OnMouseDown(){//鼠标按下
        isClick=true;
        rg.isKinematic=true;
        Invoke("Fly",0.1f);
    }
    private void OnMouseUp(){//鼠标抬起
        isClick=false;
        
        sp.isKinematic=false;
    }
    private void Update(){
        if(isClick){//鼠标一直按下,进行位置的跟随
        transform.position=Camera.main.ScreenToWorldPoint(Input.mousePosition);
        transform.position+=new Vector3(0,0,-Camera.main.transform.position.z);
    
        }
        Line();
    }    
    void Fly(){
    rg.enabked=false;
    }
    void Line(){
       right.setPosition(0,rightPos.position);
       right.setPosition(1,transform.position);
       left.setPosition(0,leftPos.position);
       left.setPosition(1,transform.position);
    }
}

在这里插入图片描述

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