2019-04-10 10:56:41 yffgamestart 阅读数 200

今天给大家总结一下我们常用的生命周期函数:

void Reset()

Reset是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。

public GameObject target;
void Reset() {
target = GameObject.FindWithTag(“Player”);
}

void Awake ()

当一个脚本实例被载入时Awake被调用。
Awake用于在游戏开始之前初始化变量或游戏状态。
在脚本整个生命周期内它仅被调用一次Awake在所有对象被初始化之后调用,所以可以安全的与其他对象对话或用诸如 GameObject.FindWithTag 这样的函数搜索它们。
每个游戏物体上的Awke以随机的顺序被调用。
Awake总是在Start之前被调用。
Awake像构造函数一样只被调用一次。

void OnEnable()

当对象变为可用或激活状态时此函数被调用。
OnEnable不能用于协同程序。
using UnityEngine;
using System.Collections;
public class OnEnabledTest : MonoBehaviour
{
void OnEnable() {
Debug.Log(“script was enabled”);
}
}

void Start()

Start仅在Update函数第一次被调用前调用。
Start在behaviour的生命周期中只被调用一次。
它和Awake的不同是Start只在脚本实例被启用时调用。
可以按需调整延迟初始化代码。
Awake总是在Start之前执行。
允许你协调初始化顺序。
初始化目标变量, 目标是私有的并且不能在检视面板中编辑
using UnityEngine;
using System.Collections;
public class StartTest : MonoBehaviour
{
private GameObject target;
void Start()
{
target = GameObject.FindWithTag(“Player”);
}
}

void FixedUpdate()

固定更新void FixedUpdate ()处理基于物理游戏行为一般用该方法,处理Rigidbody时,需要用FixedUpdate代替Update。当MonoBehaviour启用时,其 FixedUpdate 在每一帧被调用。
例如:给刚体加一个作用力时,必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)每帧应用一个向上的力到刚体上
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour
{
void FixedUpdate()
{
rigidbody.AddForce(Vector3.up);
}
}

void OnTriggerXXX(Collider other)

进入触发器void OnTriggerEnter (Collider other) 当Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter。
逗留触发器void OnTriggerStay (Collider other) 当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用。
退出触发器void OnTriggerExit (Collider other)当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。

void OnCollisionXXX (Collision collisionInfo)

进入碰撞 void OnCollisionEnter (Collision collisionInfo),当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionEnter将会在开始碰撞时调用。
逗留碰撞 void OnCollisionStay (Collision collisionInfo),当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用。
退出碰撞 void OnCollisionExit (Collision collisionInfo),当此collider/rigidbody停止触发另一个rigidbody/collider时,OnCollisionExit将被调用。
Collision包含接触点,碰撞速度等细节。如果在函数中不使用碰撞信息,省略collisionInfo参数以避免不必要的运算.

void OnMouseXXX()

void OnMouseUp ():当用户释放鼠标按钮时调用OnMouseUp。OnMouseUp只调用在按下的同一物体上。此函数在iPhone上无效。
void OnMouseDown ():当鼠标在Collider(碰撞体)上点击时调OnMouseDown。
void OnMouseEnter ():当鼠标进入到Collider(碰撞体)中时调用OnMouseEnter。
void OnMouseExit ():当鼠标移出Collider(碰撞体)上时调用OnMouseExit。
void OnMouseOver ()当鼠标悬浮在Collider(碰撞体)上时调用 OnMouseOver 。
using UnityEngine;
using System.Collections;
public class OnMouseXXX : MonoBehaviour {
void OnMouseEnter()
{
Debug.Log(“当鼠标进入”);
}
void OnMouseDown()
{
Debug.Log(“当鼠标按下”);
}
void OnMouseDrag()
{
Debug.Log(“当鼠标拖动”);
}
void OnMouseExit()
{
Debug.Log(“当鼠标推出”);
}
void OnMouseOver()
{
Debug.Log(“当鼠标经过”);
}
}

void Update ()

当MonoBehaviour启用时,其Update在每一帧被调用。Update是实现各种游戏行为最常用的函数。
using UnityEngine;
using System.Collections;
public class UpdateTest : MonoBehaviour
{
void Update() {
transform.Translate(0, 0, Time.deltaTime * 1);
}
}

void LateUpdate ()

当Behaviour启用时,其LateUpdate在每一帧被调用。
LateUpdate是在所有Update函数调用后被调用。
这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。

void OnGUI()

void OnGUI()

{

if (GUI.Button(new Rect(10, 10, 150, 100), “I am a button”))
print(“You clicked the button!”);
}

void OnDisable ()

当对象变为不可用或非激活状态时此函数被调用。当物体被销毁时它将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。

void OnDestroy ()

当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用

最后小小宣传下:一个致力于unity游戏,模型,等资源的淘宝店铺,里面有unity3d成品游戏,场景资源,模型资源等,一切资源都特别优惠,店铺链接:【unity3D素材包/unity3d中世纪村庄包Medieval Village Pack】https://m.tb.cn/h.eaENjDH?sm=2b946c 点击链接,再选择浏览器咑閞;或復·制这段描述¥kIKkbAV3c3C¥后到?淘♂寳♀?

店铺链接:
【峰回路转设计之巅】,復·制这段描述¥Rdl0bARAdpZ¥后咑閞?手机淘宝?或者用浏览器咑閞https://m.tb.cn/h.eZyY9BV?sm=f141d2查看

2014-04-30 15:51:27 qinyuanpei 阅读数 11338

      各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei

   在上一篇文章中,我们以经典的打砖块游戏为例,讲解了一个Unity3D游戏的完整实现过程。今天呢,我们来做一个在游戏中十分重要的组成元素:血条。血条是什么呢?血条是生命值的一种体现,就像《仙剑奇侠传三》电视剧中,当景天说他想让那些被邪剑仙害死的人活过来的时候,天帝说需要等量的生命值来换,所以电视剧中的结局就变成了景天留在世上的时间并不多了,雪见依偎着他坐在新安当门口的时候,天上忽然下起了雪。聊完了游戏,我们继续回到Unity3D中来,我们今天要实现的是基于2D贴图的血条组件的开发。在正式开始之前,我们先来了解下原理:血条由前后两张大小相等贴图组成,前面的贴图就是我们可以看到的血量贴图,而后面的贴图就是我们的背景贴图,通过改变血量贴图的宽度,我们就可以实现血条的效果。好,讲完了原理我们就来一起学习今天的内容吧!

    首先,我们准备两张不同颜色的贴图,如图:


    接下来,我们打开Unity3D创建一个新的项目,我们首先在场景中创建两个GUITexture对象,我们将这两个GUITexture对象分别命名为HPBackwardHPForward。在GUITexture中有一个很重要的属性PixelInset,它是一个Rect类型的值,用以描述GUITexture对象的左上角位置、宽度、高度。这里我们使用默认的坐标值,将宽度改为64,将高度改为5。两张贴图的设置要保持一致。如图所示:


    在这里需要讲一下PixelInset,由于GUITexture是采用的二维屏幕坐标来定位的,即左下角为(0,0),右上角为(1,1),所以我们不能直接使用三维坐标来改变GUITexture对象的位置。在Unity中有一个WorldToScreenPoint()方法可以将三维坐标转化为二为左边,所以我们的思路是获取目标物体的位置,将其转化为二维坐标,再赋值给GUITexture对象。好,基于这样的思路,我们可以编写下面的脚本:

  using UnityEngine;
  using System.Collections;
  
  public class Texture2DHP : MonoBehaviour 
  {
  	//前景贴图
  	public Texture ForwardTexture;
  	//背景贴图
  	public Texture BackwardTexture;
      //目标对象
  	public Transform Target;
  	//水平偏移量
  	public float OffSetX=0.05F;
  	//垂直偏移量
  	public float OffSetY=0.05F;
  	
  	//最大血量
  	public int MaxHP=100;
  	//当前血量
  	public int HP=100;
  	//血条宽度
  	public int mWidth=64;
  	//血条高度
  	public int mHeight=5;
  	
  	//前景
  	private Transform Forward;
  	//背景
  	private Transform Backward;
  	
  	void Start () 
  	{
  	   //获得前景和背景
  	   Forward=transform.Find("HPForward");
  	   Backward=transform.Find("HPBackward");
  	   //设置前景、背景贴图
  	   Forward.guiTexture.texture=ForwardTexture;
  	   Backward.guiTexture.texture=BackwardTexture;
  	   //根据目标对象初始化血条位置
  	   UpdateLocation(Target,OffSetX,OffSetY);
  	}
  	
  	
  	void Update () 
  	{
  	   UpdateLocation(Target,OffSetX,OffSetY);
  	   UpdateHP(HP);
  	}
  	
  	//更新位置
  	private void UpdateLocation(Transform mTransform,float mOffSetX,float mOffSetY)
  	{
  	    //获取目标对象高度
  	    float mHight=Target.collider.bounds.size.y;
  	    float mScale=Target.transform.localScale.y;
  	    mHight=mHight * mScale;
  		//将三维坐标转化为二维坐标
  		Vector3 mPos3d=new Vector3(mTransform.position.x,mTransform.position.y+mHight,mTransform.position.z);
  		Vector2 mPos2d=Camera.main.WorldToScreenPoint(mPos3d);
  	    //更新贴图的位置
  		Forward.position=new Vector3(mPos2d.x/Screen.width+mOffSetX,mPos2d.y/Screen.height+mOffSetY,0);
  		Backward.position=new Vector3(mPos2d.x/Screen.width+mOffSetX,mPos2d.y/Screen.height+mOffSetY,0);
  	}
  	
  	//更新血量
  	public void UpdateHP(int mValue)
  	{
  		
  		if(mValue<0 || mValue>MaxHP)
  		 return;
  		 SetGUITextureWidth(Forward.guiTexture,
  			(int)(mWidth * (mValue/(double)MaxHP)));	
  	}
  		
  	//设置贴图宽度
      private void SetGUITextureWidth(GUITexture mTexture,int mValue)
      {
  	    mTexture.pixelInset=new Rect(mTexture.pixelInset.x,mTexture.pixelInset.y,
  			mValue,mTexture.pixelInset.height);
      }
  }

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

   1、目标物体的高度是根据Collider来获取的,所以要使用血条组件的物体必须带有碰撞器。

   2、通过WorldToScreenPoint()方法获取二维坐标后,要分别用xy坐标去除以屏幕宽度、屏幕高度,目的是使坐标值介于0,1之间,因为GUITexture使用这样的坐标系。

   3、当改变脚本中的血量和目标物体的位置时,血条位置和血条量会自动更新。换言之,我们只要要改变HP的值就可以实现血条数值的更新。

   好了,现在我们在场景中创建一个空的GameObject,命名为Texture2DHP。我们将前面创建的两个GUITexture对象拖放到该对象下,使其成为子对象。我们把脚本拖放到Texture2DHP对象上,此时,我们应该可以看到下面的内容:


    我们将开始项目前准备好的两张贴图导入项目并将它们赋给脚本,其中红色的为血量贴图,黄色的背景贴图。好了,到目前为止,一个血条组件已经基本成型了,为了让它可以在项目中复用,我们将其制作成预设。下面来讲解预设的制作方法:

    预设,在Unity3D中称为Prefab,是一种可以复用的游戏体。我们首先在Project窗口中创建一个Prefab文件夹,然后在该文件下创建一个名为Texture2DHPPrefab。我们将Hierarchy窗口中的Texture2DHP拖放到Prefab中,Prefab将变成亮蓝色,此时表明预设已经创建成功。保存项目,将Hierarchy窗口中的Texture2DHP对象删除,在接下来的游戏开发中,我们将会一直用到这个预设文件。好,我们现在来测试一下今天的成果,我们首先在场景中创建一个Cube和一个胶囊体,然后我们将Texture2DHP预设直接拖放到游戏场景中,设置其目标物体为Cube,血量HP35,将其改名为CubeHP。类似地,我们为胶囊体创建一个血条组件,设置其血量HP85,将其改名为CapsuleHP。好了,现在我们来运行游戏:


   那么,我们如何在脚本中动态的改变血条的血量呢?我们只需要获取指定名称的Texture2DHP组件,然后获取Texture2DHP脚本并修改其中的HP的值就可以了。怎么样,效果还不错吧?不过基于这种方式实现的血条有一个问题,就是所有对象的血条都是在一个平面上的,这样血条的大小是不会随着距离摄像机距离的变化而表现出一种渐变的效果的,这是原理性的问题,我们目前还无法避免。博主测试模型的时候,经常出现无法获取模型高度的问题,暂时还没有想到较好的解决办法,如果大家有更好的想法,欢迎大家给我留言。那么,有没有更好的方法呢?有,那就是NGUI!好了,关于NGUI的问题,博主稍后会与大家分享。希望大家继续关注我的博客哦。今天的内容就是这个样子啦,博主期待和大家一起成长,加油!


   每日箴言:对于单纯善良的人来说,这个世界其实不复杂



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

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


2016-08-23 14:49:58 yu__jiaoshou 阅读数 1151

Unity 3D - 可视化变量标注 :

常用 :

  • 拖动条 :
    [Range(0, 100)]

  • 大标题 :
    [HeaderAttribute(“属性”)]

  • 停留提示 :
    [TooltipAttribute (“生命值”)]

  • 隐藏 :
    [HideInInspector]


public 和 private 正常情况:

  • public 的变量值会显示在 Inspector 视图中 .
public float HP;

这里写图片描述

  • private 不会显示在 Inspector 面板上 .
private float HP;

这里写图片描述


私有变量 ( private ) 显示在 Inspector 面板上 :

如何想要私有变量 (private )也显示在Inspector 面板上 , 那么就需要使用序列化 (SerializeField) .

[SerializeField]  private float HP;

这里写图片描述

使用 [SerializeField] 可以让 private 变量显示在 Inspector 面板上 , 并且不会改变变量本质( 变量任是私有的 ) .


Range 显示 :

[Range(0,100)]  private float HP;

加上一个Range 参数 , 显示方式会变成拖动条形式 .

这里写图片描述


HeaderAttribute 显示 :

 [Range(0, 100), HeaderAttribute("血量")] private float HP;

加上HeaderAttribute (“血量”) 后 , 在 Inspector 上显示如下图 .

这里写图片描述


TooltipAttribute 显示 :

[SerializeField, Range(0, 100), HeaderAttribute("血量"), TooltipAttribute("生命值")]
private float HP;

[SerializeField, Range(0, 100), HeaderAttribute("蓝量"), TooltipAttribute("魔法值")]
private float MP;

加上TooltipAttribute (“生命值”) , 鼠标放在对应变量上 , 显示如图提示 .

这里写图片描述

2015-01-16 01:32:56 caoboya 阅读数 4191

       欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频U3D教程U3D常见问题U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。

 
血药   

       物品就以血药为例。

       创建一个血药的脚本。当主角触碰血药是出发事件生命值加10.

       void OnTriggerEnter(Collider col)
       {

if (col.tag == "Player")//获取标签

           {

               Destroy(this.gameObject);//碰撞之后自动销毁

               调用一下前天说过的判断血条什么时候怎么增加的那个办法
           }

       }

金币

       创建一个金币的脚本。当主角触碰金币时金币数量加10.

       void OnTriggerEnter(Collider col)

       {

           if (col.tag == "Player") //获取标签

           {

               Destroy(this.gameObject);//碰撞之后自动销毁

               Hero.number+= 10;//金币数量加10.因为金币数量在Hero里面定义所以调用一下。

           }

       }

       最后制作金币和血药的预设体。并将血药和金币的脚本分别放到上面。
2019-02-12 12:18:09 qq_32095699 阅读数 125

视频链接:https://www.bilibili.com/video/av18791296/?p=5

1.把Sense设置为2D模式

2.添加Canvas:UHDCanvas

3.添加HUDCanvas的子对象:HealthUI

我们可以通过上面红色框中按钮移动、旋转、缩放HealthUI(中间红色框住的就是HealthUI)。

4.放置HealthUI.

按住Shift键选择锚点位置,按住Alt键选择对象位置,我们把HealthUI放在左下角。与左下角锚点对齐

5.为HealthUI添加Image

设置图片大小为30x30

5.为HealthUI添加滑动条Sillder

6.删除Handle Slide Area

7.设置HealthSlider参数:

8.添加DamageImage,并全屏显示

我们不需要背景颜色,所以把DamageImage的透明度设为0

9.UI界面完成!

Unity3D面试题整合

阅读数 1143

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