Unity3D之第三人称视角管理

using UnityEngine;
using System.Collections;

public class MouseOrbit : MonoBehaviour {
	
	public GameObject target; //目标
    public float xSpeed; //y轴旋转速度
	public float ySpeed; //x轴旋转速度
	public float yMinLimit; //x轴角度下限
	public float yMaxLimit; //x轴角度上线
	
    public float scrollSpeed; //鼠标滑轮速度
	public float zoomMin;  //摄像机离目标最近距离
	public float zoomMax; //摄像机离目标最远距离

    //Private variable
    private float distance;//摄像机与目标初始距离
	private float distanceLerp;
	private Vector3 position; 
    private bool isActivated;
    private float x;//x轴的值
	private float y;//y轴的值

    // Use this for initialization
 
    void Start () {
		
		
		//如果忘记挂载目标
		if(target == null)
		{
			target = GameObject.FindGameObjectWithTag("target");
			
			if(target == null)
			{
				Debug.LogWarning("Don't found player tag please change player tag to Player");	
			}
		}
		
        
		//初始值
		 Vector3 angles = transform.eulerAngles;
		 x = angles.y;
		 y = angles.x;
				
		CalDistance();
    }
 
 
 
    void LateUpdate () {
 		
		ScrollMouse();
		RotateCamera();
 
	}

    //旋转方法
    void RotateCamera()
    {
        //鼠标右键按下
        if (Input.GetMouseButtonDown(1))
        {

            isActivated = true;

        }

        // 鼠标右键抬起
        if (Input.GetMouseButtonUp(1))
        {
            isActivated = false;
        }



        if (target && isActivated)
        {

            y -= Input.GetAxis("Mouse Y") * ySpeed;

            x += Input.GetAxis("Mouse X") * xSpeed;



            y = ClampAngle(y, yMinLimit, yMaxLimit);


            Quaternion rotation = Quaternion.Euler(y, x, 0);
            Quaternion targetRotate = Quaternion.Euler(0, x, 0);

            target.transform.rotation = targetRotate;

            Vector3 calPos = new Vector3(0, 0, -distanceLerp);

            position = rotation * calPos + target.transform.position;

            transform.rotation = rotation;

            transform.position = position;


        }
        else
        {
            Quaternion rotation = Quaternion.Euler(y, x, 0);

            Vector3 calPos = new Vector3(0, 0, -distanceLerp);

            position = rotation * calPos + target.transform.position;

            transform.rotation = rotation;

            transform.position = position;
        }
    }
	
 	//固定距离
 	void CalDistance()
	{
		distance = zoomMax;
		distanceLerp = distance;
		Quaternion rotation = Quaternion.Euler(y, x, 0);	
		Vector3 calPos = new Vector3(0, 0, -distanceLerp);
	    position = rotation * calPos + target.transform.position;
	    transform.rotation = rotation;
	    transform.position = position;
	}
	
	//鼠标滑轮滑动
	void ScrollMouse()
	{
		distanceLerp = Mathf.Lerp(distanceLerp,distance,Time.deltaTime * 5);
		if (Input.GetAxis("Mouse ScrollWheel") != 0 ) 
			{	
				// get the distance between camera and target
 
				distance = Vector3.Distance (transform.position , target.transform.position);	
 
				distance = ScrollLimit(distance - Input.GetAxis("Mouse ScrollWheel")*scrollSpeed, zoomMin, zoomMax);
 
			}
	}
	
 	//鼠标滑轮限制
	float ScrollLimit(float dist, float min, float max)
    {
        if (dist < min)
 
            dist= min;
 
        if (dist > max)
 
            dist= max; 
 
		return dist;
    }
	
	
	//角度限制
	float ClampAngle(float angle,float min,float max)
	{
		if(angle < -360)
			angle += 360;
		if(angle > 360)
			angle -= 360;
		return Mathf.Clamp(angle,min,max);
	}
}
这是Top-Down RPG Starter Kit这个demo里面的代码,做个笔记。若有侵权请私信。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3D实现第三人称人物控制的代码可以分为以下几个部分: 1. 创建角色模型和动画: 首先,你需要创建一个角色模型,并为其添加动画。可以使用Unity内置的角色模型或导入自定义的角色模型。然后,为角色模型添加动画控制器,用于管理不同的动画状态,例如行走、奔跑、跳跃等。 2. 控制角色移动: 在角色控制脚本,你需要定义一些变量来控制角色的移动速度、旋转速度等。使用Input类获取玩家的输入,例如键盘按键或鼠标移动,根据输入来改变角色的位置和旋转。 3. 实现相机跟随: 第三人称视角通常需要一个跟随相机,以便玩家可以看到角色周围的环境。你可以将相机放置在角色后方,并使用脚本使其跟随角色的位置和旋转。可以使用Lerp函数平滑地移动相机,以避免抖动。 4. 处理碰撞和障碍物: 在游戏,角色可能会与环境的障碍物发生碰撞。你可以使用Unity提供的碰撞检测功能来检测碰撞,并根据需要处理碰撞事件,例如停止角色的移动或触发特定的动画。 下面是一个简单的示例代码,用于实现基本的第三人称控制: ```csharp using UnityEngine; public class ThirdPersonController : MonoBehaviour { public float moveSpeed = 5f; public float rotateSpeed = 10f; public Transform cameraTransform; private Rigidbody rb; private void Start() { rb = GetComponent<Rigidbody>(); } private void Update() { // 获取玩家输入 float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical"); // 移动角色 Vector3 movement = new Vector3(horizontal, 0f, vertical) * moveSpeed * Time.deltaTime; rb.MovePosition(transform.position + transform.TransformDirection(movement)); // 旋转角色 if (movement != Vector3.zero) { Quaternion toRotation = Quaternion.LookRotation(movement); transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, rotateSpeed * Time.deltaTime); } // 跟随相机 if (cameraTransform != null) { cameraTransform.position = transform.position; cameraTransform.rotation = transform.rotation; } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值