2014-04-19 19:05:28 cooelf 阅读数 10625
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4722 人正在学习 去看看 张刚

       在网上有很多通过射线方式实现的人物行走控制脚本,但是如果只是想通过键盘按键来控制的话,比如进行第三人称视角控制,其实只需要进行简单的角度变换即可。思路如下:

1、按照顺时针方向设定前、右、后、左分别为0,1,2,3。

2、设定状态初值0,即朝向前方。

3、通过当前方向值减去前一次方向值,乘以90°即为转向角,然后进行旋转变换即可。

using UnityEngine;
using System.Collections;
using System.Linq;
public class move: MonoBehaviour
{
	private int State;//角色状态
	private int oldState=0;//前一次角色的状态
	private int UP = 0;//角色状态向前
	private int RIGHT =1;//角色状态向右
	private int DOWN = 2;//角色状态向后
	private int LEFT = 3;//角色状态向左
	
	public float speed=8;
	
	void Start()
	{
	}
	void Update()
	{
		if (Input.GetKey("w"))
		{
			setState(UP);
		}
		else if (Input.GetKey("s"))
		{
			setState(DOWN);
		}
		
		if (Input.GetKey("a"))
		{
			setState(LEFT);
		}
		else if (Input.GetKey("d"))
		{
			setState(RIGHT);
		}
		
	}
	
	
	void setState(int currState)
	{
		Vector3 transformValue = new Vector3();//定义平移向量
		int rotateValue = (currState - State) * 90;
		transform.animation.Play("walk");//播放角色行走动画
		switch (currState)
		{
		case 0://角色状态向前时,角色不断向前缓慢移动
			transformValue = Vector3.forward * Time.deltaTime * speed;
			break;
		case 1://角色状态向右时,角色不断向右缓慢移动
			transformValue = Vector3.right * Time.deltaTime * speed;
			break;
		case 2://角色状态向后时,角色不断向后缓慢移动
			transformValue = Vector3.back * Time.deltaTime * speed;
			break;
		case 3://角色状态向左时,角色不断向左缓慢移动
			transformValue = Vector3.left * Time.deltaTime * speed;
			break;
		}
		transform.Rotate(Vector3.up, rotateValue);//旋转角色
		transform.Translate(transformValue, Space.World);//平移角色
		oldState = State;//赋值,方便下一次计算
		State = currState;//赋值,方便下一次计算
	}
	
	
}





2013-07-24 12:25:04 a2587539515 阅读数 1509
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4722 人正在学习 去看看 张刚

写在前面:由于本人是初学unity,对其中的部分机制理解还不够深,这篇文章的主要目的是记录我的开发过程,同时向读者们征求更好的解决方法。

 

上一次的鼠标点击移动的文章出了一点bug所以并不完全,这篇文章会补全。

在上一篇:鼠标点击获取地面坐标 (http://blog.csdn.net/a2587539515/article/details/9390795中我们已经输出了point这个坐标,那么鼠标控制移动就很简单了。

首先,使用unity自带的模型(使用模型需要导入资源,在建立项目的时候,根据你制作的游戏需要点击选择就好,模型就是那个修水管那个-_-||,真是的,不说做个帅的)模型中自带了动画并且会自动播放一个跑动的动画,看起来会更生动一点。我们只要模型,删除上面的所有脚本。

接下来设置相机,设置到一个你想要的位置就好,把相机拖到主角身上,让相机跟随主角移动。

按照上一篇的方法,我们会得到一个Point的点,接下来我们只要让主角走到那个点上就好啦。

 

首先让主角面向那个点,我们使用LookAt函数(其实一开始我想加一个转身时间,如果哪位大神有好的算法,请给我留言,不胜感激),这个函数能直接将模型转到一个点的方向。文档如下:

 

Rotates the transform so the forward vector points at /target/'s current position.

旋转物体,这样向前向量指向target的当前位置。简单说,

旋转物体使z轴指向目标物体。

接下了我们只需要让我们的主角向前走就好了。

这个是我的代码c#

mousedo.cs脚本,挂在maincamera上

 

 

using UnityEngine;
using System.Collections;

public class mousedo : MonoBehaviour {
 public GameObject liziparfab;//一个粒子效果,用来标记鼠标点击位置
 public float playerspeed;//设置人物移动速度
 public GameObject player;//我们的主角
 private bool touchbool=false;//用来判断鼠标是否点击
 private Vector3 touchpoint;//得到点击位置(和上一篇的Point相同)
 // Use this for initialization
 void Start () {
 
 }
 
 // Update is called once per frame
 void Update () {
  if(touchbool)//如果点击的话
  { 
   player.transform.LookAt(new Vector3(touchpoint.x,player.transform.position.y,touchpoint.z));//转向点击位置,注:这里的y坐标是人物的高度,防止人物旋转,有兴趣的读者可以试试也用touchpoint.y替换
   if(Mathf.Abs(Vector3.Distance(touchpoint, player.transform.position))>=2.2f)//Mathf.Abs为unity中的取觉得值函数,即当人物与目标点的距离的绝对值小于2.2时为真
   {
    player.transform.Translate(Vector3.forward*playerspeed*Time.deltaTime);//这里让人物向前移动
   }
   else
    touchbool=false;//这里设置为false人物就不会再移动

  }
 if(Input.GetMouseButton(1))
  {//从这里开始和上一篇相同
  Ray ray = camera.ScreenPointToRay(Input.mousePosition);
  RaycastHit hit;
  if (Physics.Raycast(ray, out hit))
   {
    if(hit.transform.name=="Terrain")
    {
     touchbool=true;
    }
    touchpoint=hit.point;
    Instantiate(liziparfab,touchpoint,hit.transform.rotation);

//这里实例化了一个粒子效果
   }
  }
 }
}

在脚本设置好后,人物还是会出现bug(这里就是纠结了我一天的东西-_-||),比如不会下落,但是加入了刚体属性后,人物却又直接穿过地面,恶,到现在我都不明白那个Character Controller到底有什么用,总之我用box Collider替换了它,之后还有一个问题就是人物在走向斜坡时由于box collider的性质太死板,人物会翻滚,额……(其实挺欢乐的……),嘛,总之得改,于是我们在刚体属性中的Constraints限制了物体的Rotation让其不能翻滚,初步的demo总算是成型了,当然目前这个还并不十分完美,应该说是槽点巨多……呵呵,之后如果有更好的方法会来这继续更新……


就此搁笔了,如果文章对您有帮助,我深感荣幸

 

 

2018-01-28 11:04:10 A13155283231 阅读数 581
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4722 人正在学习 去看看 张刚

移动人物的另外一种方法

  // 总是朝着镜头所指方向移动
  Vector3 desiredMove = m_Cam.forward * v + m_Cam.right * h;
  desiredMove = desiredMove.normalized;

  desiredMove.x = desiredMove.x * speed;
  desiredMove.z = desiredMove.z * speed;
  desiredMove.y = 0;  // 不向上移动
  //if (playerRigidbody.velocity.sqrMagnitude < (speed * speed))
  //{
  //    playerRigidbody.AddForce(desiredMove, ForceMode.Impulse);
  //}

  // 不加会产生飘移(地面摩檫力)
  if (grounded)
  {
      playerRigidbody.drag = 5f;

      if (!Input.GetButtonDown("Jump") && Mathf.Abs(h) < float.Epsilon && Mathf.Abs(v) < float.Epsilon && playerRigidbody.velocity.magnitude < 1f)
      {
          playerRigidbody.Sleep();
      }
      playerRigidbody.AddForce(desiredMove, ForceMode.Impulse);
  }
  else
  {
      playerRigidbody.drag = 0f;
  }
2015-03-13 22:49:29 u011410529 阅读数 6227
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4722 人正在学习 去看看 张刚
using UnityEngine;
using System.Collections;

public class PlayerControl : MonoBehaviour
{
    [HideInInspector]        //隐藏属性,让其不在面板上显示
    public bool facingRight = true;     //定义朝向
    [HideInInspector]
    public bool jump = false;   // 跳跃属性
    public float moveForce = 200f;  // 所加的力
    public float maxSpeed = 5f;     // x轴上的最大速度

    public float jumpForce = 300f;          // Amount of force added when the player jumps.

    public Transform groundCheck;        //本组件检测是否在地面上!!!
    public LayerMask whatIsGround;
    private float groundRadius=0.2f;
    private bool grounded = false;      
    private Animator anim;      // 指向角色动画组件


    void Awake()
    {
        anim = GetComponent<Animator>();
    }


    void Update()
    {
        //本方法返回真假  
        grounded = Physics2D.OverlapCircle (groundCheck.position, groundRadius, whatIsGround);
        if(Input.GetKeyDown (KeyCode.Space)&&grounded )
            jump = true;  //按下空格键且角色在地上
    }


    void FixedUpdate ()
    {
        // 获取你的用力方向和大小
        float h = Input.GetAxis("Horizontal");

        // 速度这个动画参数取决于你按键的用力大小
        anim.SetFloat("speed", Mathf.Abs(h));
        if(h * rigidbody2D.velocity.x < maxSpeed)
        {
            rigidbody2D.velocity=new Vector2(h*maxSpeed,rigidbody2D.velocity.y);
        }


        if(Mathf.Abs(rigidbody2D.velocity.x) > maxSpeed)
            //如果角色的速度大于最大速度
            rigidbody2D.velocity = new Vector2(Mathf.Sign(rigidbody2D.velocity.x) * maxSpeed, rigidbody2D.velocity.y);

        // 向右按的时候角色朝向是左方
        if(h > 0 && !facingRight)

            Flip();
        //转向函数
        else if(h < 0 && facingRight)

            Flip();


        if(jump)
        {
            anim.SetTrigger("jump");
            jump = false;
        }
    }


    void Flip ()
    {

        facingRight = !facingRight;

        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }

这个脚本可以直接使用,是博主根据官方API编写,有删改。

2014-11-08 21:29:35 liketing 阅读数 1662
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4722 人正在学习 去看看 张刚
using UnityEngine;
using System.Collections;
/**
 * 人物移动,摄像机跟随
 * */
public class PersonMove : MonoBehaviour {
	//跟随的摄像机
	public Camera currCamera;
	//人物目标坐标
	private Vector3 targetPos;
	//人物与摄像机的距离
	private Vector3 apartPos;
	// Use this for initialization
	private Vector3 mouseRightPos;
	void Start () {
		//将目标坐标初始化成当前坐标
		targetPos = transform.position;
		//计算人物与摄像机的距离
		apartPos = transform.position - currCamera.transform.position;
	}

	void FixedUpdate(){

		if (targetPos != transform.position) {
			//获取人物身上的组件
			CharacterController cc = GetComponent<CharacterController> ();
			//获取人物每一步移动的坐标
			Vector3 currPos = Vector3.ClampMagnitude (targetPos - transform.position, 0.1f);
			//移动到坐标
			cc.Move (currPos);
			//计算出摄像机的目标坐标
			Vector3 cameraTarget = transform.position-apartPos;
			//设置摄像机的坐标
			currCamera.transform.position=Vector3.MoveTowards(currCamera.transform.position,cameraTarget,0.1f);
		}

	}
	void Update () {
	
		if(Input.GetMouseButtonDown(0)){
			targetPos = getTargetPos();
		}
		if(Input.GetMouseButton(1)){
			float i = Input.GetAxis("Mouse X");
			if(i<0){
				i=-1;
			}
			//让摄像头围绕人物旋转
			currCamera.transform.RotateAround(transform.position,Vector3.up,i*50*Time.deltaTime);
			//计算人物与摄像机的距离
			apartPos = transform.position - currCamera.transform.position;
		}
	}
	Vector3 getTargetPos(){
		Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
		RaycastHit hit;
		if(Physics.Raycast(ray,out hit)){
			if(hit.transform.name=="Terrain"){
				return hit.point;
			}
		}
		return new Vector3(0,0,0);
	}

}

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