U3D游戏开发中控制摄像机缩进与位置旋转系列

U3D游戏开发中,PC端游戏往往可以实现摄像头移动,比如缩进以及以玩家为轴左右旋转。我们可以通过以下代码实现,我将与大家一同分享:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowPlayer : MonoBehaviour
{
    private Transform player;
    //位置偏移
    private Vector3 offsetPosition;
    public float distance = 0;
    public float scrollSpeed = 8;
    private bool IsRotating = false;
    public float rotateSpeed = 2;
    // Start is called before the first frame update
    void Start()
    {
        player = GameObject.FindGameObjectWithTag(Tags.player).transform;
        transform.LookAt(player.position);
        offsetPosition = transform.position - player.position;
    }

    // Update is called once per frame
    void Update()
    {
        transform.position = offsetPosition + player.position;

        //处理视野的旋转
        RotateView();
        //处理视野的拉近拉远效果
        ScrollVlew();
    }
    void ScrollVlew()
    {
        //向后滑动,拉近视野(返回负值)
        //向前滑动,拉远视野(返回正值)
        if (UICamera.isOverUI == false)
        {
            distance = offsetPosition.magnitude;
            //但是我觉得向前滑动拉近,向后滑动拉远所以就修改了一下代码
            distance -= Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
            distance = Mathf.Clamp(distance, 2, 19);
            offsetPosition = offsetPosition.normalized * distance;
        }
    }

    void RotateView()
    {
        //得到鼠标在水平方向的滑动
        Input.GetAxis("Mouse X");
        //得到鼠标在竖直方向的滑动
        Input.GetAxis("Mouse Y");
        if (Input.GetMouseButtonDown(1))
        {
            IsRotating = true;
        }
        if (Input.GetMouseButtonUp(1))
        {
            IsRotating = false;
        }
        if (IsRotating)
        {
            transform.RotateAround(player.position, player.up, rotateSpeed * Input.GetAxis("Mouse X"));
            Vector3 originalPos = transform.position;
            Quaternion originalRotation = transform.rotation;
            transform.RotateAround(player.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));
            float x = transform.eulerAngles.x;
            if (x < 10 || x > 80)
            {
                //超出范围后,旋转将无效
                transform.position = originalPos;
                transform.rotation = originalRotation;
            }
            x = Mathf.Clamp(x, 10, 80);
            transform.eulerAngles = new Vector3(x, transform.eulerAngles.y, transform.eulerAngles.z);
        }
        offsetPosition = transform.position - player.position;
    }
}

使用以上代码可以解决摄像机的问题,很多项目中都可以直接使用。如果对你有帮助就点赞收藏吧!我还有很多系列的代码,几乎都是完整代码可运行的一些代码逻辑,我后续会更新更多的内容,包括2D系列,热更新系列等等,需要的可以关注我噢!为了提供更好的学习环境未开启收费模式,希望大家共同学习,做更好的游戏!(游戏人最后的挣扎)

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nicole Potter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值