Unity相机绕物体旋转、视野缩放功能的c#脚本实现(模拟物品展台功能),且相机参数可调

为了实现照相机的物品展台功能,查询了网上各种各样的方法,有的需要导入资源包什么的,觉得都比较复杂。

代码部分参考了一位大佬的文章,这里附上文章链接。
————————————————
版权声明:本文为CSDN博主「董豪强」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012730137/article/details/80103332

————————————————

废话不多说,步骤就分为简单三步:

第一步,创建一个空物体命名为target放在待展出场景的旋转中心点位置

第二步,把以下脚本命名为CameraControl挂载到展台的相机下面。

using UnityEngine;
public class CameraControl : MonoBehaviour
{
    public Transform target;
    public float xSpeed = 200, ySpeed = 200, mSpeed = 10;  //分别定义相机横向、纵向的旋转速度,视野缩放速度
    public float yMinLimit = 5, yMaxLimit = 50; //限制纵向的最小最大旋转角
    public float distance = 50, minDistance = 2, maxDistance = 100; //设置初始状态相机的视野范围,以及相机所能缩放的最小最大范围
    public bool needDamping = true; //是否需要相机阻尼效果
    float damping = 5f; //相机阻尼系数
    public float x = 0f; //初始状态照相机横向旋转角度
    public float y = 0f; //初始状态照相机纵向旋转角度


    private Vector3 m_mouseMovePos;
    private Camera camera;


    private void Start()
    {
        camera = GetComponent<Camera>();
    }
    // Update is called once per frame
    void LateUpdate()
    {


        if (target)
        {
            //鼠标点击右键划动控制相机围绕target旋转;鼠标滚轮改变视野
            if (Input.GetMouseButton(1))
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;


                y = ClampAngle(y, yMinLimit, yMaxLimit);
            }
            distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed;
            distance = Mathf.Clamp(distance, minDistance, maxDistance);


            Quaternion rotation = Quaternion.Euler(y, x, 0.0f);  //
            Vector3 disVector = new Vector3(0f, 0f, -distance);
            Vector3 position = rotation * disVector + target.position;
            if (needDamping)
            {
                transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);
                transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);
            }
            else
            {
                transform.rotation = rotation;
                transform.position = position;
            }

        }
    }
    static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}

第三步,在检查器中把该脚本里的“目标”定义为第一步创建的target。其他参数的作用见代码备注,大家酌情修改后运行即可。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
NullReferenceException: Object reference not set to an instance of an object Inventory.OnClickPickUp () (at Assets/Script/Inventory.cs:39) UnityEngine.Events.InvokableCall.Invoke () (at <ff7b004c24954ff98f68a709be4708c3>:0) UnityEngine.Events.UnityEvent.Invoke () (at <ff7b004c24954ff98f68a709be4708c3>:0) UnityEngine.UI.Button.Press () (at D:/Program Files/Unity/Hub/Editor/2019.4.14f1c1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:68) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at D:/Program Files/Unity/Hub/Editor/2019.4.14f1c1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/UI/Core/Button.cs:110) UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at D:/Program Files/Unity/Hub/Editor/2019.4.14f1c1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at D:/Program Files/Unity/Hub/Editor/2019.4.14f1c1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/ExecuteEvents.cs:261) UnityEngine.EventSystems.EventSystem:Update() (at D:/Program Files/Unity/Hub/Editor/2019.4.14f1c1/Editor/Data/Resources/PackageManager/BuiltInPackages/com.unity.ugui/Runtime/EventSystem/EventSystem.cs:377)
06-10

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值