多点移动,经常用到


using UnityEngine;
using System.Collections;

public class test1 : MonoBehaviour 
{
	
		public float rx1=dataAll.rx1;
	public float rx2=dataAll.rx2;
	public float rz1=dataAll.rz1;
	public float rz2=dataAll.rz2;
	public Transform target;
	public Vector3 temp,temp2;
	public GameObject obj;
	public bool Key_zhao;
	public int Key_dian;
	public bool keymove;
	public Transform mayi;
	void Start () 
	{
				keymove=true;
		target=GameObject .Find("nailao_A").transform;
		mayi=transform.Find("MaYi");
		mayi.animation.CrossFade("run");
				temp=new Vector3(target.position.x,transform.position.y,target.position.z);

		StartCoroutine("C");
	  
	}
	
	void Update () 
	{
	  	if(keymove)
		{
			transform.Translate(Vector3.forward*Time.deltaTime*0.2f);
		  if(Vector3.Distance(transform.position,temp2)<0.02f)
			{	
				if(Key_zhao==false)
				{
				  Key_zhao=true;
			      StartCoroutine("C");
				}
			}
			else
			{
			  Key_zhao=false;//
			}
	}
}
	
	void C()
	{
		if(Key_dian<3)
		{
				 temp2=new Vector3(Random.Range(rx1,rx2),transform.position.y,Random.Range(rz1,rz2));
            //StartCoroutine("checkpengzhu",temp2);
			while(Vector3.Distance(temp2,temp)<0.4f)
			{
				 temp2=new Vector3(Random.Range(rx1,rx2),transform.position.y,Random.Range(rz1,rz2));
			}
			transform.LookAt(temp2);
		}
		else
		{
			transform.LookAt(temp);
		}
		Key_dian++;
	}
	
	
	void checkpengzhu(Vector3 temp2)
	{
		
	}
		void OnTriggerEnter(Collider other)
	{
		if(other.tag=="Cheese"&&Key_dian>3)   //碰到奶酪,开始吃
		{
			keymove=false;
		}
    }
	
}














如果你在游戏的开发中,想要控制主角的移动却又不想处理刚体的碰撞,那么Unity3D中的角色控制器组件CharacterController就可以满足你的要求了。它包含一些刚体的属性,比如,如果在一个添加了角色控制器组件的对象上添加一个带有SimpleMove()函数的脚本,那么该对象的重力被自动应用,而且该对象的Y轴上的速度被忽略;而如果你想保留Y轴上的速度,不应用重力,则可使用角色控制器的Move()函数控制对象。好了,下面通过具体的例子来学习角色控制器CharacterController的使用方法。

       我们要实现的效果是我们的英雄在三个点之间来回直线运动,并且在到达某一点时实现转身的效果。

       首先新建一个工程,我们把需要的主角模型拖到场景中,主角模型可以从文章最后的工程下载后获得。我们把贴图拖到主角模型上,就出现了一个帅气的魔法师角色。然后我们新建一个平面Plane,三个空对象,命名为point1,point2,point3,并添加标识,还有在场景中加入一个Directional light灯光。完成之后的效果如下:

                   

         然后我们开始编写脚本代码,新建一个C#文件,重命名为“heroControl”,具体代码如下所示,注释都已添加。

[csharp]   view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class heroControl : MonoBehaviour {  
  5.   
  6.     //定义主角角色控制器  
  7.     CharacterController hero;  
  8.   
  9.     //点数组  
  10.     public Transform[] points;  
  11.   
  12.     //下一个点的下标,主角移动速度  
  13.     public int nextIndex;  
  14.     public int moveSpeed = 10;  
  15.   
  16.     void Start()  
  17.     {  
  18.         //初始化主角移动速度  
  19.         nextIndex = 0;  
  20.         //获得主角的角色控制器组件  
  21.         hero = GetComponent<CharacterController>();  
  22.     }  
  23.     void Update()  
  24.     {  
  25.         //如果主角距离点的距离大于0.2,则算出主角的朝向,移动主角人物  
  26.         if (Vector3.Distance(ignoreY(points[nextIndex % points.Length].position), ignoreY(transform.position)) > 0.2f)  
  27.         {  
  28.             //主角的朝向即为下一个点坐标减去主角坐标的向量  
  29.             Vector3 direction = (ignoreY(points[nextIndex % points.Length].position) - ignoreY(transform.position)).normalized;  
  30.             //插值改变主角的朝向,使其有一个自然转向的过程,防止其瞬间转向  
  31.             hero.transform.forward = Vector3.Lerp(transform.forward, direction, 0.1f);  
  32.             //移动主角  
  33.             hero.SimpleMove(transform.forward * moveSpeed);  
  34.         }  
  35.         else  
  36.         {  
  37.             //如果到达点,则使下一点作为目标点  
  38.             nextIndex++;  
  39.         }  
  40.     }  
  41.     //这个函数用来取消向量的Y轴影响,比如主角的高度与点之间可能有一段距离,我们要忽略这段距离  
  42.     Vector3 ignoreY(Vector3 v3)  
  43.     {  
  44.         return new Vector3(v3.x, 0, v3.z);  
  45.     }  
  46. }  

       最后我们把脚本文件拖到主角模型上,然后别忘了把三个点拖到我们定义的点数组中

                

      好了,运行程序,我们可以看到主角自己在三个点之间来回巡逻,并在到达某一点后转身继续向下一点运动,我们这里只是截图,所以看不出效果,请大家下载项目工程源码后运行查看效果。


void Update () 
	{	
		if(i>=3&&Vector3.Distance(transform.position,points[r%4].position)>dis/2)
	    {
		    i=4;
		    transform.LookAt(new Vector3(target.position.x,transform.position.y,target.position.z));
	    }
		if(Vector3.Distance(transform.position,points[(r+1)%4].position)>0.02f)
		{
			if(!Key_turn&&i<4)
			{
			    transform.LookAt(points[(r+1)%4]);
				//Debug.Log("AAA"+(r+1)%4);
				Key_turn=true;
			}
	     }
		else
		{
			r++;
			i++;
			Key_turn=false;
		}
       transform.Translate(Vector3.forward*Time.deltaTime*speed);
	
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值