球形检测 unity3d

2016-12-28 13:49:05 ax1274669874 阅读数 15530

Unity3D项目中,灯光摄像机都是一个游戏中十分重要的组件,下面我们就来谈谈Unity3D教程中的Light光源。如果大家对Unity3D感兴趣,就来菜鸟在线观看我们的Unity3D教程。

  在Unity项目中,灯光和摄像机是非常重要的游戏组件。灯光可以提升游戏的画面质感,摄像机可以捕捉游戏的场景,并将其输出到屏幕上。如果大家对Unity3D感兴趣,就来菜鸟在线观看Unity3D教程,相信你一定会喜欢,奉上链接:http://www.newbieol.com/course_0_1.html

  灯光用来照亮场景和对象,可以创造完美的视觉气氛。灯光可以用来模拟太阳、燃烧的火柴、探照灯、手电筒、枪火光、爆炸等等。

  我们通过在Hierarchy面板->Create->Light来创建4种不同的灯光效果。如图1-10所示。

Unity3D教程之Light光源

  四种类型的灯光:

  Directional Light平行光(方向光)  最省资源  可以改变角度  联想:太阳

  Point Light点光源(由一个点向四周发射光源)  可以改变位置  联想:灯泡

  Spot Light聚光灯(聚光/锥光)  最耗费资源  可以改变位置和角度  联想:手电

  Area Light区域光(创造灯光贴图烘焙时使用)  无法应用于实时光照

Unity3D教程之Light光源

图1-12 Light组件属性

  Light灯光组件常用属性介绍(如图1-12):

  1、Type:光源的类型。

  2、Color:光照颜色。

  3、Intensity:[ɪn'tensɪtɪ] 光照浓度。

  4、Cookie:设置贴图Alpha通道。(在此属性中放置一张透明贴图作为蒙版,从而通过灯光照射打到地面上形成一个预期形状的光影效果)。

  5、Cookie Size:设置贴图Alpha通道尺寸大小。

  6、Shadow Type:阴影类型。(Soft Shadows参数最耗费资源)。

  7、Draw Halo:绘制光晕(在点光源中使用雾蒙蒙的效果)。如果勾选该选项,一个球形的光晕将被绘制。光晕的半径等于范围(Range)。

  8、Flare:设置光源的闪光效果。用于在光照位置上渲染的闪光。

  9、Render Mode:光源的渲染模式。选择光源是作为顶点光(vertex),像素光(pixel),还是自动的渲染方式。

  注:要说明的是,灯光有对渲染速度有非常大的影响,因此必须权衡前后照明质量和游戏速度。由于像素光照比顶点光照奢侈得多(更耗费资源),Unity将只在最亮的光逐个像素渲染。

  10、Culling Mask:通过层设置指定图层不受到光照影响。

  11、Lightmapping:设置光照贴图模式。

  注意: 只有平行光可以加影子(在Inspector->Shadow Type)。若想在其它灯光下也能有阴影属性,则需修改Rendering Path(渲染路径)。

  操作渲染路径的方法为:菜单->Edit->Project Setting->Player(如图),然后在PlayerSettings属性中可以找到Rendering Path(渲染路径)属性选择。分为Vertex Lit(顶点照射)、Forward(向前照射)、Deferred Lighting(延时照射)三个选项。如图1-13所示。我们修改属性为Deferred Lighting即可。

Unity3D教程之Light光源

  图1-13 设置Rendering Path属性(灯光渲染路径)

2019-10-04 21:31:53 Ron_Wang168 阅读数 526

Unity3D是一款渲染功能非常强大、交互性能优越的游戏引擎,著名的《纪念碑谷》就是采用该引擎开发的。

用过Unity3D的读者知道,Unity中只提供了正方体、球形、圆柱体等基础形状的预设体,那么如何在Unity3D中产生任意形状的物体呢?下面就我个人的经验,提供几种可能的思路,详见下面链接:

https://www.jianshu.com/p/1f79e33308a6

2014-09-08 01:32:37 qinyuanpei 阅读数 22641

       各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。在上一篇文章<[Unity3D]Unity3D游戏开发之角色控制漫谈>一文中,博主与大家分享自己在角色控制方面的一些感悟。今天呢,我们继续来探讨Unity3D角色控制的内容,今天博主将解决在上一篇文章中没有解决的问题,即自由视角下的角色控制。如图是博主非常喜欢的《古剑奇谭》游戏截图,在这款游戏中就使用了博主今天要讲解的自由视角,所谓自由视角是指玩家可以按照自身坐标系向着四个不同的方向移动,当玩家按下鼠标右键时,可以绕Y轴按照一定的角度旋转摄像机,在旋转的过程中,角色将旋转相应的角度。在移动的过程中,摄像机会保持与玩家间的一定距离,然后跟随角色进行移动。好了,下面我们正式开始今天的内容吧!


     

     在开始今天的内容前,首先让我们来学习下Unity3D中较为重要的一部分知识,理解这些知识是我们开始学习今天内容的基础。

     1、Input.GetAxis():该方法用于在Unity3D中根据坐标轴名称返回虚拟坐标系中的值,通常情况下,使用控制器和键盘输入时此值范围在-1到1之间。这段话怎么理解呢?我们来看下面这段脚本:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {

	//水平速度
	public float HorizontalSpeed = 2.0F;
	//垂直速度
	public float VerticalSpeed = 2.0F;

	void Update() 
	{
		//水平方向
		float h = HorizontalSpeed * Input.GetAxis("Mouse X");
		//垂直方向
		float v = VerticalSpeed * Input.GetAxis("Mouse Y");
		//旋转
		transform.Rotate(v, h, 0);
	}
}
这段脚本呢是根据鼠标的位置来旋转物体从而实现对物体的观察,从这段脚本中我们可以看出,通过获取输入轴的办法,我们可以获得鼠标移动的方向进而实现对于物体的旋转控制。在Unity3D中我们可以通过Edit->Project Setting->Input来查看项目中的坐标轴名称:


在后面,我们还将使用这种方式,大家可以对这个方法有进一步的了解。


     2、欧拉角eulerAngles:该值是Vector3类型的值,x、y、z分别代表绕x轴旋转x度,绕y轴旋转y度,绕z轴旋转z度。因此,该值最为直观的形式是可以允许我们直接以一个三维向量的形式来修改一个物体的角度,例如下面的脚本:

float mY = 5.0;

void Update () 
{
	mY += Input.GetAxis("Horizontal");
	transform.eulerAngles =new Vector3(0,mY, 0);
}
     如果你已经理解了上面的话,那么不出意外的,这段脚本会如你所愿的,按照鼠标在水平方向上移动的方向绕Y轴旋转。通常情况下,我们不会单独设置欧拉角其中一个轴,例如eulerAngles.x = 10,因为这将导致偏移和不希望的旋转。当设置它们一个新的值时,要同时设置全部。好在我们可以通过Quaternion.Euler()方法将一个Vector3类型的值转化为一个四元数,进而通过修改Transform.Rotation来实现相同的目的。

    

     3、插值:所谓插值是指离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。在某些情况下,如果我们希望过程中处理得较为平滑,此时我们就可以使用插值的方法来实现对中间过程的模拟。在Unity3D中我们可以使用两种插值方法,即线性插值Lerp,球形插值SLerp。我们来看下面的脚本:

void Rotating (float horizontal, float vertical)
	{
		// Create a new vector of the horizontal and vertical inputs.
		Vector3 targetDirection = new Vector3(horizontal, 0f, vertical);
		
		// Create a rotation based on this new vector assuming that up is the global y axis.
		Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);
		
		// Create a rotation that is an increment closer to the target rotation from the player's rotation.
		Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotation, turnSmoothing * Time.deltaTime);
		
		// Change the players rotation to this new rotation.
		rigidbody.MoveRotation(newRotation);
	}
插值的方法很简单,只要我们给出初始和结束的状态、时间就可以了,大家可以自己看API。


      好了,有了这三部分的基础,我们就可以开始今天的内容了,今天的脚本分为两个部分,第一部分是角色控制的部分,主要负责的角色在场景中的移动、转身和动画处理。第二部分是相机控制的部分,主要涉及相机旋转、相机缩放的相关内容。下面,我们分别来讲这两个部分,场景依然是博主自己在做的小游戏:


本次的主角呢,是博主非常喜欢的角色谢沧行,好了,我们回到今天的内容里吧!在第一部分,主要的是完成角色向各个方向的转身,这里博主定义四个方向(其实八个方向是一样的!),脚本如下:

using UnityEngine;
using System.Collections;

public class NoLockiVew_Player : MonoBehaviour {

	/*自由视角下的角色控制*/
	/*作者:秦元培*/

	//玩家的行走速度
	public float WalkSpeed=1.5F;
	//重力
	public float Gravity=20;

	//角色控制器
	private CharacterController mController;
	//动画组件
	private Animation mAnim;
	//玩家方向,默认向前
	private DirectionType mType=DirectionType.Direction_Forward;

	[HideInInspector]
	//玩家状态,默认为Idle
	public PlayerState State=PlayerState.Idle;

	//定义玩家的状态枚举
	public enum PlayerState
	{
		Idle,
		Walk
	}

	//定义四个方向的枚举值,按照逆时针方向计算
	protected enum DirectionType
	{
		Direction_Forward=90,
		Direction_Backward=270,
		Direction_Left=180,
		Direction_Right=0
	}
	
	void Start () 
	{
	   //获取角色控制器
	   mController=GetComponent<CharacterController>();
	   //获取动画组件
	   mAnim=GetComponentInChildren<Animation>();
	}
	
	
	void Update () 
	{
		MoveManager();
		//MouseEvent();
	}

	//玩家移动控制
	void MoveManager()
	{
		//移动方向
		Vector3 mDir=Vector3.zero;
		if(mController.isGrounded)
		{
			//将角色旋转到对应的方向
			if(Input.GetAxis("Vertical")==1)
			{
				SetDirection(DirectionType.Direction_Forward);
				mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
				mAnim.CrossFade("Walk",0.25F);
				State=PlayerState.Walk;
			}
			if(Input.GetAxis("Vertical")==-1)
			{
				SetDirection(DirectionType.Direction_Backward);
				mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
				mAnim.CrossFade("Walk",0.25F);
				State=PlayerState.Walk;
			}
			if(Input.GetAxis("Horizontal")==-1)
			{
				SetDirection(DirectionType.Direction_Left);
				mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
				mAnim.CrossFade("Walk",0.25F);
				State=PlayerState.Walk;
			}
			if(Input.GetAxis("Horizontal")==1)
			{
				SetDirection(DirectionType.Direction_Right);
				mDir=Vector3.forward * Time.deltaTime * WalkSpeed;
				mAnim.CrossFade("Walk",0.25F);
				State=PlayerState.Walk;
			}
			//角色的Idle动画
			if(Input.GetAxis("Vertical")==0 && Input.GetAxis("Horizontal")==0)
			{
				mAnim.CrossFade("Idle",0.25F);
				State=PlayerState.Idle;
			}

		}
		//考虑重力因素
		mDir=transform.TransformDirection(mDir);
		float y=mDir.y-Gravity *Time.deltaTime;
		mDir=new Vector3(mDir.x,y,mDir.z);
		mController.Move(mDir);
	}

	//设置角色的方向,有问题
	void SetDirection(DirectionType mDir)
	{
		if(mType!=mDir)
		{
			transform.Rotate(Vector3.up*(mType-mDir));
			mType=mDir;
		}
	}
}
这里定义四个方向,是按照逆时针方向转的,相邻的两个方向间相差90度,所以我们只需要将当前的角度和目标角度相减就可以转到目标角度的方向(其实这是以前写的代码,现在回头再看,直接用欧拉角似乎更为简单啊,呵呵)。这里主要的内容就是这样了。下面我们来看相机控制部分的代码吧,这里的代码参考了MouseOrbit脚本,主要完成了鼠标右键旋转控制,博主在此基础上增加了相机缩放的代码。提到相机缩放,其实就是根据鼠标滚轮滚动的方向和大小重新计算角色与相机的距离,与之类似地还有小地图的放缩,其实同样是通过修改距离来实现的。博主今天的一个体会是官方的代码能自己写一遍的最好自己写一遍,这样好多东西就能在这个过程中给理解了。我们一起来看脚本
using UnityEngine;
using System.Collections;

public class NoLockView_Camera : MonoBehaviour 
{
	//观察目标
	public Transform Target;
	//观察距离
	public float Distance = 5F;
	//旋转速度
	private float SpeedX=240;
	private float SpeedY=120;
	//角度限制
	private float  MinLimitY = 5;
	private float  MaxLimitY = 180;

	//旋转角度
	private float mX = 0.0F;
	private float mY = 0.0F;

    //鼠标缩放距离最值
	private float MaxDistance=10;
	private float MinDistance=1.5F;
	//鼠标缩放速率
	private float ZoomSpeed=2F;

	//是否启用差值
	public bool isNeedDamping=true;
	//速度
	public float Damping=2.5F;

	void Start () 
	{
		//初始化旋转角度
		mX=transform.eulerAngles.x;
		mY=transform.eulerAngles.y;
	}
	
	void LateUpdate () 
	{
		//鼠标右键旋转
		if(Target!=null && Input.GetMouseButton(1))
		{
		    //获取鼠标输入
			mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;
			mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;
			//范围限制
			mY = ClampAngle(mY,MinLimitY,MaxLimitY);
		}

		//鼠标滚轮缩放

		Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
		Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);

		//重新计算位置和角度
		Quaternion mRotation = Quaternion.Euler(mY, mX, 0);
		Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;

		//设置相机的角度和位置
		if(isNeedDamping){
		   //球形插值
		   transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping); 
		   //线性插值
		   transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping); 
		}else{
		   transform.rotation = mRotation;
		   transform.position = mPosition;
		}
		//将玩家转到和相机对应的位置上
		if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk)
		{
			Target.eulerAngles=new Vector3(0,mX,0);
		}
	}
	
	private float  ClampAngle (float angle,float min,float max) 
	{
		if (angle < -360) angle += 360;
		if (angle >  360) angle -= 360;
		return Mathf.Clamp (angle, min, max);
	}
    



}



这里很多朋友可能对我设置一个状态很不理解吧,这其实是为了让玩家有一个自由查看角色的机会,否则当玩家按下鼠标右键的话,角色就会转向相机正对着的位置,这样玩家就看不到角色的正面了。当然,这里用到了插值,这样能使角色在转身的时候平滑一点,效果会更好。

唉,不知不觉已经这个时候了,开学已经一周了,这学期我们只上九周课,然后就是实习、毕设、找工作一大堆事情在等着我们。可是不知道为什么博主宿舍的同学居然还能每天什么事情都不做,从早上一直看电视剧到晚上十点,虽然这件事情和博主没有什么关系吧,可是整个宿舍的人都安安静静地做着自己的事情,就有这么一个人整天声音开得很大在那里外放,这样真的好吗?以前和这个人闹过一次,因为他聚了一帮人在宿舍打麻将,我觉得吵就说了他一顿,结果就和我僵上了。说真的,博主对目前的专业真的没有什么情感,大学四年里最让博主开心的事情就是博主学会了好多自己想要学的东西,认识了几个不错的老师和朋友,仅此而已。或许我们注定要越走越远吧,因为我们根本就不是同一种人。

前几天网上有人通过博客联系到博主,希望博主能到他哪里工作,可惜博主目前仍然有一大堆的琐事缠身,不然离开这喧嚣吵闹的宿舍,去做博主喜欢的事情,去寻找博主自己的梦想,博主相信,博主一定可以做得更好吧。人生或许就是这样,你越是在乎的可能越让你得不到,你无心插柳可能会得到一片绿荫。对于未来,不管怎么样,坦然面对就好了,博主改变不了周围的这群人,只能努力地去改变自己。好了,晚安吧!

效果演示(2M的限制让很多展示都无可奈何)



每日箴言:所有的悲伤,总会留下一丝欢乐的线索。所有的遗憾,总会留下一处完美的角落。我在冰封的深海,找寻希望的缺口。却在午夜惊醒时,蓦然瞥见绝美的月光。——几米


       喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei。
       转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/39125353


      文章更新:

      9月10日,博主在测试这个项目的时候意外地发现了一个Bug。Bug出现在如下位置:

		//设置玩家跟随角度
		if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk)
		{
			Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));
		}

该方法主要的作用是当玩家同时按下方向控制键和鼠标右键,玩家可以随着鼠标旋转到对应的角度,这主要是为了满足玩家双手操作的需求,不过由于这行代码,导致玩家在向左、向右、向后三个方向上的转身失效,如果除去这行代码,则原来的方向控制没有任何问题,可是没有这行代码,玩家的操作感就会下降。后来博主想到我们对角色的旋转实际上应该是放在鼠标右键事件里的,所以博主将代码修改如下,这样就解决了这个Bug:

using UnityEngine;
using System.Collections;

public class NoLockView_Camera : MonoBehaviour 
{
	//观察目标
	public Transform Target;
	//观察距离
	public float Distance = 5F;
	//旋转速度
	private float SpeedX=240;
	private float SpeedY=120;
	//角度限制
	private float  MinLimitY = 5;
	private float  MaxLimitY = 180;

	//旋转角度
	private float mX = 0.0F;
	private float mY = 0.0F;

    //鼠标缩放距离最值
	private float MaxDistance=10;
	private float MinDistance=1.5F;
	//鼠标缩放速率
	private float ZoomSpeed=2F;

	//是否启用差值
	public bool isNeedDamping=true;
	//速度
	public float Damping=10F;

	private Quaternion mRotation;

	void Start () 
	{
		//初始化旋转角度
		mX=transform.eulerAngles.x;
		mY=transform.eulerAngles.y;
	}
	
	void LateUpdate () 
	{
		//鼠标右键旋转
		if(Target!=null && Input.GetMouseButton(1))
		{
		    //获取鼠标输入
			mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;
			mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;
			//范围限制
			mY = ClampAngle(mY,MinLimitY,MaxLimitY);
			//计算旋转
			mRotation = Quaternion.Euler(mY, mX, 0);
			//根据是否插值采取不同的角度计算方式
			if(isNeedDamping){
				transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping); 
			}else{
				transform.rotation = mRotation;
			}
			//处理同时按下鼠标右键和方向控制键
			if(Target.GetComponent<NoLockiVew_Player>().State==NoLockiVew_Player.PlayerState.Walk){
				Target.rotation=Quaternion.Euler(new Vector3(0,mX,0));
			}
		}

		//鼠标滚轮缩放
		Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
		Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);

		//重新计算位置
		Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;

		//设置相机的角度和位置
		if(isNeedDamping){
		   transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping); 
		}else{
		   transform.position = mPosition;
		}

	}


	//角度限制
	private float  ClampAngle (float angle,float min,float max) 
	{
		if (angle < -360) angle += 360;
		if (angle >  360) angle -= 360;
		return Mathf.Clamp (angle, min, max);
	}
}


不过经过博主测试,如果不采用插值的话,似乎效果更为真实啊(为什么会和第一次测试的感觉不一样啊,囧!)




2017-08-26 17:47:33 qq_39736751 阅读数 1817

Destroy线性操作:伤害门。

生成游戏对象

publicclassCreateCubes : MonoBehaviour

    {

        // Use this for initialization

        void Start()

        {

        }

        float timer = 0.0f;

        // Update is called once per frame

        void Update()

        {

            timer += Time.deltaTime;

            if (timer > 3)

            {

                timer -= 3;

                GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);

                obj.transform.position = newVector3(0, 0.5f, 0);

                obj.AddComponent<MoveDoor>();

            }

        }

}

对象移动

publicclassMoveDoor : MonoBehaviour

{

    // Use this for initialization

    void Start()

    {

    }

    // Update is called once per frame

    void Update()

    {

       gameObject.transform.Translate(gameObject.transform.forward * Time.deltaTime);

    }

}

判断是否受到伤害

publicclassPhysicsDemo : MonoBehaviour

{

    publicGameObject startObj;

    publicGameObject endObj;

    // Use this for initialization

    void Start()

    {

    }

    // Update is called once per frame

    void Update()

    {

        RaycastHit hit;

        if (Physics.Linecast(startObj.transform.position,endObj.transform.position, out hit))

        {

            if (!hit.collider.gameObject.CompareTag("Door"))

            {

               Destroy(hit.collider.gameObject);

            }

        }

    }

}

球形检测:吸铁石效果。

玩家移动

publicclassCoinMove : MonoBehaviour

{

    publicTransform target;

    publicbool isMove = false;

    // Use this for initialization

    void Start()

    {

 

    }

    // Update is called once per frame

    void Update()

    {

        if (isMove)

        {

            transform.position = Vector3.Lerp(transform.position, target.position,0.2f);

        }

    }

    void OnTriggerEnter(Collider other)

    {

        if (other.gameObject.CompareTag("Player"))

        {

            Destroy(gameObject);

        }

    }

}

金币移动和消失的条件

publicclassCubeMove : MonoBehaviour

{

    bool isMagnet = false;

    publicfloat speed;

    // Use this for initialization

    void Start()

    {

    }

    // Update is called once per frame

    void Update()

    {

        transform.Translate(transform.forward *speed * Time.deltaTime);

        if (isMagnet)

        {

            Collider[] cols = Physics.OverlapSphere(transform.position, 10);

            foreach (var item in cols)

            {

                if (item.gameObject.CompareTag("Coin"))

                {

                   item.GetComponent<CoinMove>().isMove = true;

                }

            }

        }

}

void OnTriggerEnter(Collider other)

    {

        if (other.gameObject.tag == "Magnet")

        {

            Destroy(other.gameObject);

            isMagnet = true;

        }

}

这里写图片描述

这里写图片描述

2017-08-21 20:12:08 qq_39710961 阅读数 1926

线性操作:伤害门。
生成游戏对象
using UnityEngine;
using System.Collections;
public class CreateCubes : MonoBehaviour {

// Use this for initialization
void Start () {
}
float timer = 0.0f;
// Update is called once per frame
void Update () {
    timer += Time.deltaTime;
    if (timer>3)
    {
        timer -= 3;
        GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
        obj.transform.position = new Vector3(0,0.5f,0);
        obj.AddComponent<MoveDoor>();
    }
}

}
对象移动
using UnityEngine;
using System.Collections;
public class MoveDoor : MonoBehaviour {

// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
    gameObject.transform.Translate(gameObject.transform.forward * Time.deltaTime);
}

}
判断是否受到伤害
using UnityEngine;
using System.Collections;
public class PhysicsDemo : MonoBehaviour {

public GameObject startObj;
public GameObject endObj;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
    RaycastHit hit;
    if (Physics.Linecast(startObj.transform.position, endObj.transform.position,out hit))
    {
        if (!hit.collider.gameObject.CompareTag("Door"))
        {
            Destroy(hit.collider.gameObject);
        }
    }
}

}
球形检测:吸铁石效果。
玩家移动
using UnityEngine;
using System.Collections;
public class CoinMove : MonoBehaviour {

public Transform target;
public bool isMove = false;
// Use this for initialization
void Start () {

}
// Update is called once per frame
void Update () {
    if (isMove)
    {
        transform.position = Vector3.Lerp(transform.position, target.position, 0.2f);
    }
}
void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Player"))
    {
        Destroy(gameObject);
    }
}

}
金币移动和消失的条件
using UnityEngine;
using System.Collections;
public class CubeMove : MonoBehaviour {

bool isMagnet = false;
public float speed;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
    transform.Translate(transform.forward *speed * Time.deltaTime);
    if (isMagnet)
    {
        Collider[] cols = Physics.OverlapSphere(transform.position, 10);
        foreach (var item in cols)
        {
            if (item.gameObject.CompareTag("Coin"))
            {
                item.GetComponent<CoinMove>().isMove = true;
            }
        }
    }
 }
void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "Magnet")
    {
        Destroy(other.gameObject);
        isMagnet = true;
    }
}

}
这里写图片描述

这里写图片描述