前言:实现小鸟的动画,之前吐槽过js写U3D,就改成了C#来写,没想到遇到问题了。

实现的效果

using UnityEngine;
using System.Collections; /// <summary>
/// 2D动画组件
/// </summary>
public class aniSprite : MonoBehaviour
{ /// <summary>
/// 是否启动2D动画
/// </summary>
public bool isUsed = false; /// <summary>
/// 动画的时间(0表示永远运行)
/// </summary>
public float timeLength = ; /// <summary>
/// 动画有多少列(动画多个图片)
/// </summary>
public int columnSize; /// <summary>
/// 动画有多少行
/// </summary>
public int rowSize; /// <summary>
/// 起始帧从那列开始
/// </summary>
public int colFrameStart; /// <summary>
/// 起始帧从那行开始
/// </summary>
public int rowFrameStart; /// <summary>
/// 总共多少帧
/// </summary>
public int totalFrames = ; /// <summary>
/// 每秒运行多少帧动画
/// </summary>
public int framePerSecond; /// <summary>
/// 总共运行多长时间
/// </summary>
public int totalTime; /// <summary>
/// 设置运行多长时间
/// </summary>
private float myTime = ; private float myTimeLength = ; /// <summary>
/// 是否运行
/// </summary>
private bool isPlay = true; /// <summary>
/// 2D
/// </summary>
private Vector2 size; /// <summary>
/// 2D 设置
/// </summary>
private Vector2 offSet; private int u; // Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{
if (isUsed)
{
AniSprit(columnSize, rowSize, colFrameStart, rowFrameStart, totalFrames, framePerSecond, totalTime, true);
}
myTimeLength += Time.deltaTime;
if (timeLength != && myTimeLength > timeLength)
{
Destroy(gameObject);
}
} /// <summary>
/// 动画组件(坦克游戏)
/// </summary>
/// <param name="columnSize">动画有多少列</param>
/// <param name="rowSize">动画有多少行</param>
/// <param name="colFrameStart">起始帧从那列开始</param>
/// <param name="rowFrameStart">起始帧从那行开始</param>
/// <param name="totalFrames">总共多少帧</param>
/// <param name="framePerSecond">每秒运行多少帧动画</param>
/// <param name="totalTime">总共运行多长时间</param>
/// <param name="moveDirection">运动方向</param>
/// <returns></returns>
bool AniSprit(int columnSize, int rowSize, int colFrameStart, int rowFrameStart, int totalFrames, int framePerSecond, int totalTime, bool moveDirection)
{
myTime += Time.deltaTime;//累积时间
if (totalTime != && myTime > totalTime)//游戏停止运行
{
isPlay = false;
myTime = ;//重新计时
return isPlay;
}
int index = (int)(myTime * (framePerSecond - ));//-1:去掉一个缩影
index = index % totalFrames;
int v = index / columnSize;
if (moveDirection)
{
size = new Vector2( / columnSize, / rowSize);
u = index % columnSize;
}
else
{
size = new Vector2(- / columnSize, / rowSize);
u = -index % columnSize;
}
offSet = new Vector2((u + colFrameStart) * size.x, ( - size.y) - (v + rowFrameStart) * size.y);
renderer.material.mainTextureOffset = offSet;
renderer.material.mainTextureScale = size;
return true;
}
}

注意小鸟图片显示时设置好Tiling为1/3=0.33 否则会显示3只鸟,这个也和css样式中设置图片一样。

1、发现运行起来Game中就是没“鸟”

这个问题真的是折腾了我半天,为了找个“鸟” 我直接pass刚才做的,把视频从头在看一遍又一遍再做一遍,结果还是这样没“鸟”……排除了深度问题和其他可能的问题后,发现U3D断点也许能找到答案

2、Unity3D 如何设置断点?

  vs2012里面断点不进去,(vs2010也试过不行)

  2.1、在Mono中选择Run-Attach to Process

  

  2.2、附件到进程中

  

  2.3、Mono变成可调式状态

  

  2.4、在Unity3D中启动你的游戏,设置好你需要的断点即可。发现问题在这:

  这是C#版本  

  

  这是js版本

  

js代码

#pragma strict

var isUsed:boolean=false;
var timeLength:float=0;
var columnSize:int;
var rowSize:int;
var colFrameStart:int;
var rowFrameStart:int;
var totalFrames:int=1;
var framePerSecond:int;
var totalTime:float=1; private var myTime:float=0;
private var myTimeLength:float=0;
private var isPlay:boolean=true;
private var size:Vector2;
private var offSet:Vector2;
private var u:int; function Start () { } function Update () {
if(isUsed){
AniSprit(columnSize, rowSize , colFrameStart , rowFrameStart , totalFrames ,framePerSecond ,totalTime ,true);
}
myTimeLength+=Time.deltaTime;
if(timeLength!=0&&myTimeLength>timeLength){
Destroy(gameObject);
}
}
/// <summary>
/// 动画组件(坦克游戏)
/// </summary>
/// <param name="columnSize">动画有多少列</param>
/// <param name="rowSize">动画有多少行</param>
/// <param name="colFrameStart">起始帧从那列开始</param>
/// <param name="rowFrameStart">起始帧从那行开始</param>
/// <param name="totalFrames">总共多少帧</param>
/// <param name="framePerSecond">每秒运行多少帧动画</param>
/// <param name="totalTime">总共运行多长时间</param>
/// <param name="moveDirection">运动方向</param>
/// <returns></returns>
function AniSprit( columnSize:int, rowSize:int, colFrameStart :int, rowFrameStart:int, totalFrames:int,framePerSecond:int,totalTime:int,moveDirection:boolean)
{
myTime+=Time.deltaTime;//累积时间
if(totalTime!=0&&myTime>totalTime){
isPlay=false;
myTime=0;
return isPlay;
}
var index:int=myTime*(framePerSecond-1);
index=index%totalFrames;
var v=index/columnSize;
if(moveDirection){
size=Vector2(1.0/columnSize,1.0/rowSize);
u=index%columnSize;
}
else{
size=Vector2(-1.0/columnSize,1.0/rowSize);
u=-index%columnSize;
} offSet=Vector2((u+colFrameStart)*size.x,(1.0-size.y)-(v+rowFrameStart)*size.y);
renderer.material.mainTextureOffset=offSet;
renderer.material.mainTextureScale=size;
return true;
}

  当局者迷啊,只能自我安慰了,实在不仔细!万幸的是解决了问题。要认真!要细心!下面继续下去。。。。

birdMove C#

using UnityEngine;
using System.Collections; /// <summary>
/// 小鸟弹跳
/// </summary>
public class birdMove : MonoBehaviour
{ /// <summary>
/// 是否掉在地上
/// </summary>
private bool isGround = false; /// <summary>
/// 0-1随机变量
/// </summary>
private float randomNumber; /// <summary>
/// 多少秒跳一次
/// </summary>
public float seconds;
// Use this for initialization
void Start()
{
InvokeRepeating("Move", , seconds);//定时重复处理
} // Update is called once per frame
void Update()
{
if (!isGround)
{
if (randomNumber > 0.5f)
{
//transform.localEulerAngles.z += Time.deltaTime * 400;
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, Time.deltaTime * * transform.localEulerAngles.z);
//transform.Rotate(new Vector3(transform.localRotation.x, transform.localRotation.y, transform.localRotation.z + Time.deltaTime * 100f));
//x、y、z角代表绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度(这个顺序)。
}
else
{
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, -Time.deltaTime * * transform.localEulerAngles.z);
//transform.localEulerAngles.z -= Time.deltaTime * 400;
}
}
if (slingShot.isJump)
{ }
} void Move()
{
//transform.rigidbody.velocity.y =2.0f ;// [və'lɒsətɪ]速率,速度
transform.rigidbody.velocity = new Vector3(transform.rigidbody.velocity.x, 2.0f, transform.rigidbody.velocity.z);
isGround = false;
randomNumber = Random.Range(, );
}
/// <summary>
/// 进入碰撞
/// 当collider/rigidbody开始触动另一个rigidbody/collider时OnCollisionEnter被调用。
/// </summary>
/// <param name="collision"></param>
void OnCollisionEnter(Collision collision)
{
isGround = true;
new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, );
//transform.localEulerAngles.z = 0;// 使得小鸟正对前方 Euler Angles欧拉角
}
}

Move.js

#pragma strict
/// <summary>
/// 小鸟弹跳
/// </summary> private var isGround:boolean=false;//是否掉在地上 private var randNumber:float; var seconds:float; function Start () {
InvokeRepeating("Move",2,seconds);//2s定时重复处理
} function Update () {
if(!isGround){
if(randNumber>0.5){
transform.localEulerAngles.z+=Time.deltaTime*400;
}else{
transform.localEulerAngles.z-=Time.deltaTime*400;
}
} //
} function Move(){
transform.rigidbody.velocity.y=2.0;//bird1向上的速度
isGround=false;//向上了 所以ground为false
randNumber=Random.Range(0,1.0);
} function OnCollisionEnter(collision:Collision){
isGround=true;
transform.localEulerAngles.z=0;// 使得小鸟正对前方 Euler Angles欧拉角
}

小鸟在旋转时C#代码还是有瑕疵,以js为主

重点L::

  C#不能给每个参数单独赋值 只能读
  比如你要改Z轴的值 可以这样写
    transform.localEulerAngles = new Vector3(transform.localEulerAngles.x,transform.localEulerAngles.y, Z);
  Z换成需要的值就行了

Unity3D笔记 愤怒的小鸟<五> 小鸟动画+Unity3D如何设置断点调式的更多相关文章

  1. Unity3D笔记 模型和角色动画的输出设置

  2. Unity3D笔记 愤怒的小鸟<七> 小鸟群准备动画

    要实现的目标: 1.3只小鸟初始动画 2.完善代码slingShot.js 3.完善代码BirdMoving.js 1.实现3个准备动画:Unity3D内置的动画管理器 1.1.先选择GameObje ...

  3. Unity3D笔记 愤怒的小鸟<六> 弹弓发射小鸟

    要实现的目标 实现个性化的鼠标 实现弹弓 选择小鸟.拉升弹弓.发射小鸟 弹弓橡皮筋 声音 1.实现个性化鼠标 效果 2.添加弹弓 建立两个材质 创建一个空GameObject 把两个shoot拖进来统 ...

  4. Unity3D笔记 愤怒的小鸟<二> 实现Play界面

    创建Play界面.能个把各个图片组合成一个场景,场景组成后背景能够不停的滚动,当鼠标单击时显示图片手型鼠标 一.GUI Texture 1.创建背景.地面.树木.草 ,这里注意Z轴的排序,一层一层则第 ...

  5. Unity3D笔记 愤怒的小鸟<一>场景切换

    新建3个场景,场景1 Start 十秒后自动切换到场景2 Splash,场景2在二秒后自动切换到场景3 Selection 一.场景一Start 二.场景2 Splash 三.场景3 Selectio ...

  6. Unity3D笔记 愤怒的小鸟<四> 实现Selelction界面

    一直跟着龚老师用js写,VS智能感应用习惯后发现这里用js对初学者比较蛋疼,MONO有提示但是还是无法和VS媲美就目前来看.所以这次还是换成熟悉的VS来开发. 目标:实现关卡页面 跑起来的效果如下: ...

  7. Unity3D笔记 愤怒的小鸟<三> 实现Play界面2

    前言:在Play页面中给Play页面添加一个“开始游戏”和“退出游戏”按钮顺便再来一个背景音乐 添加按钮可以是GUI.Button(),也可以是GUILayout.Button():给图片添加按钮可以 ...

  8. Unity3D笔记十五 碰撞、移动

    碰撞 Collision. [kəˈliʒən] 碰撞:冲突:(意见,看法)的抵触:(政党等的)倾轧 选择一个需要添加碰撞器的游戏对象后 Component->Physics- Unity一共为 ...

  9. Unity3D开发(五):Unity3D 4.x 使用Mecanim实现连击(转)

    原地址:http://www.unitymanual.com/blog-1801-1221.html unity3d 4.x 版本之后提供了一种新的动画机制Mecanim,虽然目前还支持之前的Anim ...

随机推荐

  1. lsof fuser

    使用fuser 或 lsof在一个挂载点中查找已打开的文件 fuser -mv /usr 查看有哪些进程在运行/usr中资源 sync fuser -km /media/usbdisk U盘无法卸载

  2. iOS开发异常处理教程

    以下是两篇xcode开发如何处理异常的教程,建议一读 part 1 part 2 梗概如下: 基本上你能碰到两种崩溃的情况:SIGABRT (也叫EXC_CRASH),和EXC_BAD_ACCESS  ...

  3. vuex在页面中以对象展开运算符形式引入报错解决

    当页面中以mapGetters等对象扩展运算符写的时候,会报错 unexpected token 解决如下: babel还要加插件才能解释这个写法 npm install --save-dev bab ...

  4. chrome二维码插件 – w3cways QR Code Generator

    最近研究了下Chrome插件的制作方法,制作了一个二维码插件. 安装方法 方法一:在Chrome应用商店中安装(推荐)点击安装(需FQ) 方法二:本地安装:下载安装包,解压得到w3cways_qrCo ...

  5. mysql中如何查看某个日期所在的周一是几号?某个日期所在的一周开始时间是几号?

    需求描述: 在编写SQL的时候,有这么个需求,就是要查出来某个日期所在的周一是几号,进行了测试,在此进行记录下. 测试过程: 议题:查看某个日期所在的周一是几号 分析:如果某个日期是周一,那么加上整数 ...

  6. python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)

    介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. # coding=u ...

  7. gcc和g++头文件和库路径的寻找和添加

    对所有用户有效修改/etc/profile文件 对个人有效则修改~/.bashrc文件 #在PATH中找到可执行文件程序的路径. export PATH =$PATH:$HOME/bin (可一次指定 ...

  8. Maven发布war包到Tomcat

    一.修改Tomcat下配置文件tomcat-users.xml,然后启动 <role rolename="manager-gui"/> <role rolenam ...

  9. 【SVN】自动定时更新

    程序或脚本:"C:\Program Files\TortoiseSVN\bin\svn.exe" 参数:update E:\XXXXProjects\Code 参考:https:/ ...

  10. Unity绘制Png图片

    using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; publ ...